Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子表没有父表';s id作为外键-JPA/Hibernate_Java_Hibernate_Jpa - Fatal编程技术网

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);
   }
}