java - 如何映射包含多对多的可嵌入对象

标签 java hibernate jpa

我有以下数据库架构:

enter image description here

以及以下模型:

enter image description here

我正在努力将 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/

相关文章:

spring - 域、DAO 和服务层

java - HQL 中的 between 是否严格比较?

java - JPA/Hibernate 仅加入选定的一列

java - 使用 Groovy 1.8、Hibernate JPA 注释构建失败

java - Hibernate/JPA 自动创建外键而不是在多对一关联中使用现有的外键

java - 未编译 "base operand of ‘->’ 的 JNI IMU 代码具有非指针类型 ‘JNIEnv’“

java - 如何将特定比较器转换为 Lambda 表达式?

java - 尝试自动生成 id 时出现 SQL 异常

java - 如何在运行时从 jasper 中删除标题标签?

java - 当我尝试将多个数据插入子表时出现错误无法执行 JDBC 批量更新