簡體   English   中英

保存具有休眠子關系的Hibernate實體失敗,並出現外鍵錯誤

[英]Save Hibernate entity with parend child relationships fails with foreign key error

我受到侵犯-嘗試保存休眠實體時找不到父鍵

我有上級實體:

@Entity
@Table(name = "parents")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1246376778314918671L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    @SequenceGenerator(name = "seq", sequenceName = "PARENT_ID_SEQ", allocationSize = 1)
    @Column(name = "parent_id")
    private long parentId;

    @Column(name = "display_name")
    @Size(min = 1, max = 128)
    @NotBlank   
    private String displayName;

    @JsonManagedReference("childAssignments")
    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
    private Set<ChildAssignment> childAssignments = new HashSet<ChildAssignment>(0);

    //regular getters and setters here
}

和子實體看起來像(在數據庫中,它在Parents表中的parent_id字段上具有外鍵):

Entity
@Table(name = "child_assignments")
public class ChildAssignment implements Serializable {
    private static final long serialVersionUID = -5949955576511639261L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    @SequenceGenerator(name = "seq", sequenceName = "CHILD_ASSIGNMENT_ID_SEQ", allocationSize = 1)
    @Column(name = "child_assignment_id")
    private long childAssignmentId;

    @Column(name = "parent_id")  
    private long parentId;   // getting error because after creating new parent it has not been set

    @Column(name = "site_id")
    private long siteId;

    @ManyToOne
    @JoinColumn(name = "parent_id", insertable = false, updatable = false)
    private Parent parent;

    // regular getters and setters here

}

創建父對象和childAssignments對象后,我將childAssignment添加到父對象

ChildAssignment ca = new ChildAssignment();
ca.setSiteId(1);
// I do not set parent_id here since I do not know it and expecting Hibernate to figure it out

parent.getChildAssignments().add(childAssignment);
session.save(parent);

預期的結果是使用ID保存新的父項,然后使用該ID保存子項,但是在保存時似乎休眠狀態不知道parent_id,我應該如何建立關聯使其起作用? 或對parent_id字段的一些注釋?

更新

我試圖刪除childAssignment實體上的parent_id或將其設置為@Transient,並且出現新錯誤,無法將NULL插入表中,很明顯,Hibernate嘗試插入parent_id,但未填充它,

給孩子設置父母也無濟於事

ChildAssignment ca = new ChildAssignment();
   ca.setSiteId(1);
   ca.setParent(parent)

   parent.getChildAssignments().add(childAssignment);
   session.save(parent);

我缺少什么?

解決了

我解決了更改childAssignment實體的問題

@Transient -- add transient (just to have it)
@Column(name = parent_id", insertable = false, updatable = false) -- add insertable and updatable  both equals to false
private parentId; 


.....

 @ManyToOne
 @JoinColumn(name = "parent_id") -- remove  insertable = false, updatable = false options
 private Parent parent;

您需要做:

ca.setParent(parent);

也一樣

如果指定雙向關系,則必須在Java代碼中分配雙方,就像純Java一樣。

其次,您對“ parentId”列的聲明是多余的。 Hibernate會自動為您創建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM