我有以下数据库架构:
以及以下模型:
我正在努力将 RootChildren
映射为 Root
中的 @Embedded
。我试过在 RootChildren
中使用 @ManyToMany
来映射 Child
的集合,但我无法让它工作。
似乎没有很多关于这个主题的在线文档,或者至少我找不到
任何有用的东西,希望有人能够提供帮助。
请注意,如果可能,我不想为双向关系建模。谢谢!
勘误表:RootChildren#children
应该是 SortedSet
。
最佳答案
我在我的临时项目中做了以下映射(在嵌入式 Derby 上运行,但这应该无关紧要)并且它似乎有效。我确实在将集合定义为SortedSet
时遇到问题,hibernate 提示“排序的集合必须定义和排序或排序”;如果我添加一个排序属性(对实体的状态可见),它就会消失,这不是您想要的。
@Entity
@Table(name="SO_ROOT")
public class Root {
@Id
@GeneratedValue(strategy=SEQUENCE)
private long id;
@Embedded
private RootChildren children;
// getters and setters
}
@Embeddable
public class RootChildren {
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "SO_ROOT_CHILDREN",
joinColumns = @JoinColumn(name = "root_id"),
inverseJoinColumns = @JoinColumn(name = "child_id")
)
@OrderColumn(name = "xorder")
private List<Child> children;
// getters and setters
}
@Entity
@Table(name="SO_CHILD")
public class Child {
@Id
@GeneratedValue(strategy=SEQUENCE)
private long id;
// getters and setters
}
测试代码:
EntityManager em = null;
try {
em = ...
em.getTransaction().begin();
Root root1 = new Root();
Root root2 = new Root();
Child r1c1 = new Child();
Child r1c2 = new Child();
Child r2c1 = new Child();
Child r2c2 = new Child();
RootChildren rc1 = new RootChildren();
rc1.setChildren(Arrays.asList(r1c1,r1c2));
RootChildren rc2 = new RootChildren();
rc2.setChildren(Arrays.asList(r2c1,r2c2));
root1.setChildren(rc1);
root2.setChildren(rc2);
em.persist(root1);
em.persist(root2);
em.getTransaction().commit();
}
finally {
EntityManagerUtil.safeClose(em);
}
关于java - 如何映射包含多对多的可嵌入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66827186/