子表没有父ID作为外键 - JPA / Hibernate

时间:2016-02-22 18:02:24

标签: java hibernate jpa

也许存在一个非常明显的答案,但我无法看到它。 我有一个父表Parent和一个子Table Child。

@Entity
@Table(name="PARENT")
public class Parent implements Serializable {

   @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
   @Column(name="PARENT_ID")
   private int parentId;

   @JsonBackReference
   @OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
   private List<Child> childs;
   ....
}

和子实体。

@Entity
@Table(name="CHILD")
public class Child implements Serializable {
   @EmbeddedId
   private ChildPK id;

   @ManyToOne
   @JsonManagedReference
   @JoinColumn(name="PARENT_ID",insertable = false, updatable = false,      referencedColumnName = "PARENT_ID")
   private Parent parent;
   ....
}

复合主键是:

@Embeddable
public class ChildPK implements Serializable {

   @Column(name="CTGRY_ID", insertable=false, updatable=false)
   private int ctgryId;

   @Column(name="PARENT_ID", insertable=false, updatable=false)
   private int parentId;
   ....
}

现在在我的服务方法中,我设置双向关系

childItem.setParent(parent);

parent.setChilds(childItemList);

并在实体上调用save:

parentDao.save(parent);

这将为PARENT表创建一个新条目,其中包含由表标识生成的pk。按照预期使用表标识生成的pk在CHILD表中创建新插入。 但是,子条目的fk应该是parentId,但它是0!

我错过了什么吗? 虽然这个问题不是唯一的,但当我尝试在网上寻找类似的问题时,很少有建议似乎没有相关性。

如果您需要更多详细信息,请与我们联系。 谢谢!

1 个答案:

答案 0 :(得分:0)

您正在使两个id的条目都不可插入(一个必须是可插入的,或者JPA实现不知道从哪里获取id):

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

@Column(name="PARENT_ID", insertable=false, updatable=false)
private int parentId;

您应该从父对象中删除 insertable = false (第一个示例)。 其他选择是从第二个删除可插入的错误并使其#34;手动&#34;在@prepersist:

@PrePersist
protected setIdsBeforeSave() {
    this.id = new ChildPK(parent.Id, categoryId);
}

修改

选项1

@Entity
@Table(name="CHILD")
public class Child implements Serializable {
   @EmbeddedId
   private ChildPK id;

   @ManyToOne
   @JsonManagedReference
   @JoinColumn(name="PARENT_ID", referencedColumnName = "PARENT_ID")
   private Parent parent;
   ....
}

其他课程保持不变

选项2

@Entity
@Table(name="CHILD")
public class Child implements Serializable {
   @EmbeddedId
   private ChildPK id;
   ....
   @PrePersist
   protected void setIdsBeforeSave() {
       //You set the parent ID, so wont be null, idk what category means, that why i just put the 0
       this.id = new ChildPK(parent.Id, 0);
   }
}