Java @无联接表的多个(旧数据库)

Java @无联接表的多个(旧数据库),java,sql,hibernate,jpa,jpa-2.0,Java,Sql,Hibernate,Jpa,Jpa 2.0,我必须在一个设计糟糕的遗留数据库中应用JPA。不幸的是,不可能改变它。幸运的是,它仅用于只读访问 我发现的最奇怪的事情之一是没有联接(或中间)表的“多对多”关系。这是表格结构的简化: USER ACCESS ---- ------ ID int primary key ID int primary key NAME varchar2(20) NAME varchar2(20) ACC

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

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

USER                      ACCESS
----                      ------
ID int primary key        ID int primary key
NAME varchar2(20)         NAME varchar2(20)
ACCESS_GROUP int          ACCESS_GROUP int
  • 访问组列可以在两个表中重复
  • 一个用户可以与N访问相关
  • 一个访问可以与N个用户相关
“概念上”此表必须通过以下方式映射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;
}
公共类用户{
私有整数id;
私有字符串名称;
@多个私有列表访问列表;
}
公共类访问{
私有整数id;
私有字符串名称;
@多个私有列表用户列表;
}

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

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

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;
    ...
}
公共类用户{
@列(name=“访问组”)
私有整数组;
@独身癖
@JoinColumn(name=“访问组”,referencedColumnName=“访问组”,
可插入=false,可更新=false)
私有列表访问列表;
...
}
公共类访问{
@列(name=“访问组”)
私有整数组;
@独身癖
@JoinColumn(name=“访问组”,referencedColumnName=“访问组”,
可插入=false,可更新=false)
私有列表用户列表;
...
}

我认为多对多定义比一对多方法更适合这种情况。虽然您可以选择其中一种,但行为和性能有所不同。 阅读通过Eclipse获得的javax文档,类似这样的无连接情况的propper映射应该是:

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;
...
}
公共类用户{
@列(name=“访问组”)
私有整数组;
@ManyToMany(targetEntity=Access.class)
私有列表访问列表;
...
}
公共类访问{
@列(name=“访问组”)
私有整数组;
@ManyToMany(targetEntity=User.class,mappedBy=“accessList”)
私有列表用户列表;
...
}

实际上,这不是M:M。如何存储一个用户或访问行是两个访问组的一部分?实现这一点的唯一方法是复制其他列(PK除外),在这种情况下,从设计的角度来看,它们是不同的实体。相反,你拥有的是两个独立的1:M关系。我尝试过非常相似的事情,但没有成功。也许我的问题是我没有在两边声明“整数组”。谢谢这不会给ACCESS\u组添加一个新的唯一约束吗?