【问题标题】:@ManyToMany without join table (legacy database)@ManyToMany 没有连接表(遗留数据库)
【发布时间】:2011-07-21 12:59:24
【问题描述】:

我必须在设计糟糕的遗留数据库中应用 JPA。不幸的是不可能改变它。幸运的是仅用于只读访问。

我发现的最奇怪的事情之一是没有连接(或中间)表的“多对多”关系。这是表结构的简化:

USER                      ACCESS
----                      ------
ID int primary key        ID int primary key
NAME varchar2(20)         NAME varchar2(20)
ACCESS_GROUP int          ACCESS_GROUP int
  • ACCESS_GROUP 列可以在两个表中重复
  • 一个 USER 可以关联到 N ACCESS
  • 一个 ACCESS 可以关联到 N USER

“概念上”这个表必须以这种方式映射到 Java 类:

public class User {
    private Integer id;
    private String name;
    @ManyToMany private List<Access> accessList;
}

public class Access {
    private Integer id;
    private String name;
    @ManyToMany private List<User> userList;
}

但我认为这是不可能的。您认为在 JPA 中访问这些表并浏览它们的最佳方法是什么?

【问题讨论】:

  • 其实这不是 M:M。您如何存储用户或访问行是两个访问组的一部分?实现这一目标的唯一方法是复制其他列(PK 除外),在这种情况下,从设计的角度来看,它们是不同的实体。相反,您拥有的是两个独立的 1:M 关系。

标签: java sql hibernate jpa jpa-2.0


【解决方案1】:

您可以尝试将其映射为两个只读的一对多关系:

public class User {
    @Column(name = "ACCESS_GROUP")
    private Integer group;

    @OneToMany
    @JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP",
        insertable = false, updateable = false)
    private List<Access> accessList;
    ...
}

public class Access {
    @Column(name = "ACCESS_GROUP")
    private Integer group;

    @OneToMany
    @JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP",
        insertable = false, updateable = false)
    private List<User> userList;
    ...
}

【讨论】:

  • 我尝试了非常相似的事情,但没有成功。也许我的问题是我没有在两边声明“整数组”。谢谢!
  • 这不会在 ACCESS_GROUP 上添加一个新的唯一约束吗?
【解决方案2】:

我认为在这种情况下,多对多定义比一对多方法更适合。尽管您可以选择其中任何一种,但具有不同的行为和性能。 阅读通过 Eclipse 获得的 javax 文档,这样的无可连接案例的属性映射应该是:

public class User {

  @Column(name = "ACCESS_GROUP")
  private Integer group;

  @ManyToMany(targetEntity=Access.class)
  private List<Access> accessList;
...
}

public class Access {

  @Column(name = "ACCESS_GROUP")
  private Integer group;

  @ManyToMany(targetEntity=User.class, mappedBy="accessList")
  private List<User> userList;
...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2012-05-02
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多