Java 子表没有父表';s id作为外键-JPA/Hibernate
也许存在一个非常明显的答案,但我看不到。 我有一个父表父表和一个子表子表Java 子表没有父表';s id作为外键-JPA/Hibernate,java,hibernate,jpa,Java,Hibernate,Jpa,也许存在一个非常明显的答案,但我看不到。 我有一个父表父表和一个子表子表 @Entity @Table(name="PARENT") public class Parent implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="PARENT_ID") private int parentId; @JsonBackReference
@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;
....
}
复合主键是:
@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);
这将按照预期为父表创建一个新条目,其中包含由表标识生成的pk。按照预期在子表中创建一个新的插入,并使用表标识生成的pk。
但是,子条目的fk应该是parentId,但它的值为0
我错过什么了吗?
虽然这个问题不是唯一的,但当我尝试在网上寻找类似的问题时,很少有建议看起来不相关
如果你需要更多的细节,请告诉我。
谢谢 您使两个id的条目都不可插入(其中一个必须可插入,否则JPA实现无法知道从何处获取id): 及 您应该从父对象中删除insertable=false(第一个示例)。 另一个选项是从第二个中删除可插入的false,并在@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);
}
}
第一个选项的结果是:javax.persistence.PersistenceException:[PersistenceUnit:default]无法生成Hibernate SessionFactory,原因是:org.Hibernate.MappingException:实体映射中的重复列:子列:父\u ID(应使用insert=“false”update=“false”进行映射)很抱歉格式设置不当。另外,关于其他选项(@PrePersist):我在ChildPK类中没有id列。它只有一个parentId和一个categoryId。那么这里需要什么呢?您是从一个字段还是两个字段中删除了insertable=false?并且,对于第二个选项,te prepersist方法必须在子类中,而不是child pk中,编辑答案以反映这一点
@PrePersist
protected setIdsBeforeSave() {
this.id = new ChildPK(parent.Id, categoryId);
}
@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;
....
}
@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);
}
}