我正在使用带有注释的 Hibernate(在 spring 中),并且我有一个具有有序、多对一关系的对象,该对象具有一个复合主键,其中一个组件是返回到父对象的id。
结构看起来像这样:
+=============+ +================+
| ParentObj | | ObjectChild |
+-------------+ 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 List<ObjectChild> attrs;
...
}
@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;
...
}
经过长时间的实验后,我得出了这个结论,在这些实验中,我的大多数其他尝试都产生了由于各种原因休眠甚至无法加载的实体。
更新:感谢大家的评论;我已经取得了一些进展。我做了一些调整,我认为它更接近(我已经更新了上面的代码)。但是,现在问题在于插入。父对象似乎保存得很好,但子对象没有保存,我能够确定的是休眠没有填写子对象的(复合)主键的 parentId 部分,所以我m 得到一个非唯一错误:
org.hibernate.NonUniqueObjectException:
a different object with the same identifier value was already associated
with the session: [org.kpruden.ObjectChild#null.attr1[0]]
我在自己的代码中填充了name
andpos
属性,但是我当然不知道父 ID,因为它还没有保存。关于如何说服hibernate填写这个的任何想法?
谢谢!