@ManyToMany没有连接表(旧数据库)

时间:2011-03-23 18:00:23

标签: java sql hibernate jpa jpa-2.0

我必须在设计糟糕的旧数据库中应用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列
  • 一个用户可以与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中访问此表并浏览它们的最佳方法是什么?

2 个答案:

答案 0 :(得分:9)

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

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;
    ...
}

答案 1 :(得分:0)

在这种情况下,我认为多对多定义适用于多对多方法。尽管您可以选择其中一种,但是具有不同的行为和性能。 阅读通过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;
...
}