@OneToMany和复合主键?
@OneToMany和复合主键?
我在Spring中使用带注解的Hibernate,我有一个对象,它与一个子对象具有有序的多对一关系,子对象具有复合主键,其中一个组成部分是指向父对象id的外键。
结构大致如下:
+=============+ +================+
| 父对象 | | 子对象 |
+-------------+ 1 0..* +----------------+
| id (pk) |-----------------| parentId |
| ... | | name |
+=============+ | pos |
| ... |
+================+
我尝试了各种注解的组合,但没有一个似乎起作用。这是我能想到的最接近的:
@Entity public class ParentObject { @Column(nullable=false, updatable=false) @Id @GeneratedValue(generator="...") private String id; @OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL}) @IndexColumn(name = "pos", base=0) private Listattrs; ... } @Entity public class ChildObject { @Embeddable public static class Pk implements Serializable { @Column(nullable=false, updatable=false) private String parentId; @Column(nullable=false, updatable=false) private String name; @Column(nullable=false, updatable=false) private int pos; @Override public String toString() { return new Formatter().format("%s.%s[%d]", parentId, name, pos).toString(); } ... } @EmbeddedId private Pk pk; @ManyToOne @JoinColumn(name="parentId") private ParentObject parent; ... }
经过长时间的尝试和实验后,我得到了这个结果,其中大部分尝试都导致Hibernate无法加载实体的各种原因。
更新:感谢大家的评论,我取得了一些进展。我进行了一些微调,我觉得已经更接近了(我已经更新了上面的代码)。现在,问题是在插入时。父对象似乎保存得很好,但子对象没有保存,我能确定的是Hibernate没有填充子对象的(复合)主键的parentId部分,所以我得到了一个不唯一的错误:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.kpruden.ObjectChild#null.attr1[0]]
我在自己的代码中填充了name和pos属性,但是当然我不知道父ID,因为它还没有保存。有没有办法说服Hibernate填充这个?谢谢!