Java 使用多通关系定义创建复合ID
Hibernate需要我的实体的ID: (抛出org.hibernate.AnnotationException:未为实体指定标识符) 下面是父实体:Java 使用多通关系定义创建复合ID,java,hibernate,many-to-one,Java,Hibernate,Many To One,Hibernate需要我的实体的ID: (抛出org.hibernate.AnnotationException:未为实体指定标识符) 下面是父实体: @Entity @Table(name = "PARENT") public class ParentDb { @Id @Column(name = "INNER_ID") @GeneratedValue(strategy = GenerationType.AUTO, generator = "G1") @Sequ
@Entity
@Table(name = "PARENT")
public class ParentDb {
@Id
@Column(name = "INNER_ID")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "SOME_SEQ")
private long id;
@Column(name = "TIMESTAMP")
private long timestamp;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", cascade = {CascadeType.ALL}, orphanRemoval=true)
private List<ChildDb> children;
}
@实体
@表(name=“PARENT”)
公共类ParentDb{
@身份证
@列(name=“internal_ID”)
@GeneratedValue(策略=GenerationType.AUTO,generator=“G1”)
@SequenceGenerator(name=“G1”,sequenceName=“SOME_SEQ”)
私人长id;
@列(name=“TIMESTAMP”)
私有长时间戳;
@OneToMany(fetch=FetchType.EAGER,mappedBy=“parent”,cascade={CascadeType.ALL},orphanRemoving=true)
私人名单儿童;
}
但是,id应该是复合的-父id和名称
如何定义这一点?我相信这样做会奏效:
@Entity
@Table(name = "CHILDREN")
public class ChildDb implements Serializable{
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INNER_ID", nullable = false)
private ParentDb parent;
@Id
@Column(name = "NAME")
private String name;
@Column(name = "VALUE")
private double value;
}在我看来,你做的奇怪事情可能是:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INNER_ID", nullable = false)
private ParentDb parent;
你的孩子身上也有“内在身份证”吗。在一对一关系中,@many单方必须是外键的所有者。为什么您认为这会起作用?你能指出一些文件吗?也许做这件事的教程没用。当我将@Id注释添加到父变量时,我得到了以下错误:
原因:org.hibernate.AnnotationException:mappedBy reference一个未知的目标实体属性:ParentDb.ChildDb.parent in ParentDb.children
@AlikElzin kilaka我认为您的问题可能在关系的另一边,你能用ParentDb定义更新你的问题吗?@Skizzo-我在问题中添加了家长的定义。你说的“外键所有者”是什么意思?你是如何拥有外键的?我已经用父项的外观更新了这个问题。如果你展示了数据库结构,我对内部ID也有同样的理解,因为你使用的是boy端的“内部ID”列
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INNER_ID", nullable = false)
private ParentDb parent;