一对多的SQL关系

huangapple 未分类评论51阅读模式
英文:

OneToMany SQL Relationships

问题

我想要在SQL中建立一个OneToMany关系和一个ManyToOne关系。我有一个Ticket实体和一个TeamMember实体。然而,当我首次保存Ticket实体时,我不会知道TeamMember,如果我将其设置为null,我会得到以下错误消息:

2020-05-29 23:49:55.754  
ERROR 24020 --- [onPool-worker-2]  o.h.engine.jdbc.spi.SqlExceptionHelper:  
列'team_member_id'不能为空

我该怎么办?

Ticket:

data class Ticket(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long = 0,
    val ticketId: String,
    var price: Int? = null,
    val openDate: LocalDateTime = LocalDateTime.now(),
    var closeDate: LocalDateTime? = null,
    var paypalId: String? = null,
    var paid: Boolean = false,
    var status: TicketStatus = TicketStatus.OPEN,
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "team_member_id", nullable = false)
    val teamMember: TeamMember? = null,
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "customer_id", nullable = false)
    val customer: Customer
)

TeamMember:

@Entity
data class TeamMember(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long = 0,
    val discordId: String,
    val joinDate: LocalDateTime,
    val ordersCompleted: Int,
    val amountMade: Int,
    val email: String,
    val pastWork: String,
    @OneToMany(mappedBy = "teamMember", cascade = [CascadeType.ALL],
            orphanRemoval = true, fetch = FetchType.EAGER)
    val tickets: Set<Ticket> = setOf()
)
英文:

I want to have a OneToMany relationship with SQL, and a ManyToOne relationship. I have a Ticket entity, and a TeamMember entity. However, when I first save the Ticket entity, I will not know the TeamMember, and if I set it to null I get this:

2020-05-29 23:49:55.754  
ERROR 24020 --- [onPool-worker-2]  o.h.engine.jdbc.spi.SqlExceptionHelper:  
Column &#39;team_member_id&#39; cannot be null

What should I do?

Ticket:

data class Ticket(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id:Long = 0,
    val ticketId:String,
    var price:Int? = null,
    val openDate:LocalDateTime = LocalDateTime.now(),
    var closeDate:LocalDateTime? = null,
    var paypalId:String? = null,
    var paid:Boolean = false,
    var status:TicketStatus = TicketStatus.OPEN,
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = &quot;team_member_id&quot;, nullable = false)
    val teamMember: TeamMember? = null,
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = &quot;customer_id&quot;, nullable = false)
    val customer:Customer
)

TeamMember:

@Entity
data class TeamMember(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id:Long = 0,
    val discordId:String,
    val joinDate:LocalDateTime,
    val ordersCompleted:Int,
    val amountMade:Int,
    val email:String,
    val pastWork:String,
    @OneToMany(mappedBy = &quot;teamMember&quot;, cascade = [CascadeType.ALL],
            orphanRemoval = true, fetch = FetchType.EAGER)
    val tickets:Set&lt;Ticket&gt; = setOf()
)

答案1

得分: 0

看看你代码中的这部分(关于 Ticket 的):

@JoinColumn(name = &quot;team_member_id&quot;, nullable = false)
val teamMember: TeamMember? = null

你使用 nullable=false 将 SQL 列设置为非 null

然而,你将属性声明为 TeamMember? 并且将其设置为 null

在持久化之前,你可以将 teamMember 设置为非 null 的值,或者根据需要将 nullable 设置为 true

英文:

Look at this part of your code (of Ticket):

@JoinColumn(name = &quot;team_member_id&quot;, nullable = false)
val teamMember: TeamMember? = null

You set the SQL column to be non-null using nullable=false.

However, you declared the attribute as TeamMember? and you set it to null.

You can either set teamMember to something that is not null before persisting it or set nullable to true (depending on what you need).

huangapple
  • 本文由 发表于 2020年5月29日 22:09:39
  • 转载请务必保留本文链接:https://java.coder-hub.com/62087893.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定