(原来的问题发生了变化,看到下面的更新。)休眠 - 使用一个包含父ID复合键 - 一对多
我有麻烦让休眠设置子对象的主键。主键与父母的主键相同。
这是父的样子:
@Entity
@Table(name = "PARENT")
@SequenceGenerator(name = "SEQ", allocationSize = 1, sequenceName = "seq_parent_id")
public class Parent {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ")
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
@JoinColumn(name = "PARENT_ID")
private Set<Child> children;
这是孩子的样子:
@Entity
@Table(name = "CHILDREN")
public class Child {
@Id
@Column(name = "PARENT_ID")
private Long parentId;
现在,当我运行JUnit库测试,让我想保存父母实体与子实体,我得到的例外:
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ...
什么是正确的方式让h ibernate自动将Child.parentId设置为parent.id?
我试着给孩子一个家长。但由于父母不是身份证,因此遇到其他例外情况。
UPDATE
我意识到,孩子的ID不是一个真正的主键。它只是一个映射关键。可以有一个parent.id的多个子条目。
更新
现在,我开始意识到我真正需要的:
孩子的主键是复合键出三个值:父ID和两个字符串值。
@Entity
@Table(name = "CHILDREN")
public class Child {
@Column(name = "PARENT_ID")
private Long parentId;
@Column(name = "PROPERTY_NAME")
private String propertyName;
@Column(name = "ANOTHER_PROPERTY")
private String anotherProperty;
@Column(name = "PROPERTY_VALUE")
private String propertyValue;
所以我需要使用parentId,properyName和anotherProperty映射复合键。 propertyValue是该条目的实际值。
我想我可能需要使用IdClass或embeddedId。我尝试了,但迄今没有成功。
您应该在关系的另一侧声明JoinColumn。在类Child中声明一个@ ManyToOne关系。但IMO,你有一个设计问题:如果一个'Parent'有多个'Child',Parent'如何可能是'Child'的主键? (几个'Child'将具有相同的'Parent'因此是相同的主键)。 –
哦,你是对的。这不是真正的主键!这只是一个关键!该表没有真实的ID。 – Nina