【问题标题】:Join JPA entities with complex association table without creating the association entity?在不创建关联实体的情况下加入具有复杂关联表​​的 JPA 实体?
【发布时间】:2019-10-29 21:03:54
【问题描述】:

我正在尝试使用不是很简单的关联表在两个 JPA 实体之间进行多对多连接。我想知道是否有一种方法可以在不创建关联表实体的情况下实现这一点(类似于使用@JoinTable)。

数据库架构

表A
- 身份证(PK)
- 名称

表B
- 身份证(PK)
- 名称

表格映射
- 身份证(PK)
- Parent_ID (FK) --> TableMapping.ID
- A_ID (FK) --> TableA.ID
- B_ID (FK) --> TableB.ID

示例

表A 身份证名称 ---------------------- A1代数 A2 数据结构 A3 经济学 表B 身份证名称 ---------------------- B1初学者 B2 高级 表映射 ID Parent_ID A_ID B_ID ---------------------------------- 1 空 空 B1 2 空 空 B2 3 1 A1 空 4 2 A2 空 5 2 A3 空

映射以我上面描述的方式存储,原因我不知道,我无法更改。它在很多地方都被这样使用,我必须按照它的方式工作。本质上,TableMapping 中的数据可以简化成这样。

A_ID B_ID ------------- A1 B1 A2 B2 A3 B2

根据我对问题的理解,有两种方法:

  1. 创建关联表的实体,并将两个实体与关联表实体进行映射。这应该可行,但如果我可以执行 @JoinTable 之类的操作而不必为此关联表创建实体,那就太好了,因为它所做的只是将 TableA 中的实体映射到 TableB 中的实体。
  2. 创建一个视图,将两个表之间的关联简化为每个映射的单个数据库行,如上所示。使用@JoinTable 中的视图。

注意:为了保持代码简单,我没有创建任何 getter/setter 或构造函数。

实体代码

@Entity
@Table(name = "TableA")
public class EntityA {

    @Id
    @Column(name = "ID")
    public int id;

    @Column(name = "NAME")
    public String name;

}

@Entity
@Table(name = "TableB")
public class EntityB {

    @Id
    @Column(name = "ID")
    public int id;

    @Column(name = "NAME")
    public String name;

    // Want to add below mapping
    // @ManyToMany
    // @JoinTable or equivalent?? 
    // public Set<EntityA> aEntitySet;
}

我不知道是否有一种方法可以在不创建实体或视图的情况下使用这个奇怪的映射表连接两个实体。有办法吗?

【问题讨论】:

    标签: java sql-server hibernate


    【解决方案1】:

    您应该首先学习数据库规范化。您应该选择 OneToMany 而不是 ManyToMany。 Tip:您可以通过在两个表之间添加另一个表来做到这一点。

    此外,您创建以使用 OneToMany 的对象必须是 List 或 Set。 you can look here for OneToMany Annotation

    【讨论】:

    • 我确实有两个实体之间的映射表(在我的示例中为 TableMapping)。这是一个现有的数据库设计,我必须按照它的方式工作。由于我只想从此数据库中读取数据,因此我正在寻找一种不必为关联表创建实体的方法。我还有另一种情况,两个实体通过映射表连接,但它更简单,我能够在 @JoinTable 的帮助下映射这两个实体,而无需创建映射表实体。同样,只读取这 2 个实体,不担心写入。
    【解决方案2】:

    如果您的问题是是否可以避免创建某种关联实体,我相信答案是否定的。毕竟它需要一个持久化的地方。

    【讨论】:

    • 有道理。我试图找到一种方法来避免保持关联的唯一原因是因为我永远不会向数据库写入任何内容,而只是从中读取。所有实体都是只读的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多