Java @无联接表的多个(旧数据库)
我必须在一个设计糟糕的遗留数据库中应用JPA。不幸的是,不可能改变它。幸运的是,它仅用于只读访问 我发现的最奇怪的事情之一是没有联接(或中间)表的“多对多”关系。这是表格结构的简化: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
USER ACCESS
---- ------
ID int primary key ID int primary key
NAME varchar2(20) NAME varchar2(20)
ACCESS_GROUP int ACCESS_GROUP int
- 访问组列可以在两个表中重复
- 一个用户可以与N访问相关
- 一个访问可以与N个用户相关
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组添加一个新的唯一约束吗?