@OneToMany和复合主键?

我正在使用带有注释的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;

...

}

经过长时间的实验后,我得出了这一结论,在该尝试中,我进行的其他大多数尝试都产生了由于各种原因甚至无法加载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]]

我在自己的代码中填充nameand pos属性,但是我当然不知道父ID,因为它尚未保存。关于如何说服hibernate状态来解决这个问题的任何想法?

谢谢!

回答:

经过大量的试验和挫折,我最终确定我无法完全做到自己想要的。

最终,我继续给孩子对象提供了自己的综合密钥,然后让Hibernate对其进行管理。这不是一个理想的方法,因为密钥几乎和其余数据一样大,但是可以使用。

以上是 @OneToMany和复合主键? 的全部内容, 来源链接: utcz.com/qa/415406.html

回到顶部