大家好
今天我遇到了一些麻烦...... 我有 3 个表,每个表之间都有多对多关系。请参阅下面的链接
下面是实体的简短定义: 分支机构
@Entity
@Table(name = "systembranches")
public class Systembranches {
private long id;
...
private Set<Systemusers> systemuserses;
private Set<Userroles> userroleses;
...
@ManyToMany
@JoinTable(
name = "branchroles",
joinColumns = @JoinColumn(
name = "BranchId",
referencedColumnName = "Id",
nullable = false),
inverseJoinColumns = @JoinColumn(
name = "UserId",
referencedColumnName = "Id",
nullable = false))
public Set<Systemusers> getSystemuserses() {
return systemuserses;
}
public void setSystemuserses(Set<Systemusers> users) {
this.systemuserses = users;
}
@ManyToMany (mappedBy = "systembranches")
public Set<Userroles> getUserroleses() {
return userroleses;
}
public void setUserroleses(Set<Userroles> userroleses) {
this.userroleses = userroleses;
}
}
用户
@Entity
public class Systemusers {
private long id;
...
private Set<Userroles> userroles;
private Set<Systembranches> systembrancheses;
...
@ManyToMany
@JoinTable(
name = "branchroles",
joinColumns = @JoinColumn(
name = "UserId",
referencedColumnName = "Id",
nullable = false),
inverseJoinColumns = @JoinColumn(
name = "RoleId",
referencedColumnName = "Id",
nullable = false))
public Set<Userroles> getUserroles() {
return userroles;
}
public void setUserroles(Set<Userroles> roles) {
this.userroles = roles;
}
@ManyToMany (mappedBy = "systemuserses")
public Set<Systembranches> getSystembranches() {
return systembrancheses;
}
public void setSystembranches(Set<Systembranches> systembrancheses) {
this.systembrancheses = systembrancheses;
}
}
角色
@Entity
public class Userroles {
private long id;
...
private Set<Systemusers> systemusers;
private Set<Systembranches> systembrancheses;
...
@ManyToMany (mappedBy = "userroles")
public Set<Systemusers> getSystemusers() {
return systemusers;
}
public void setSystemusers(Set<Systemusers> systemusers) {
this.systemusers = systemusers;
}
@ManyToMany
@JoinTable(
name = "branchroles",
joinColumns = @JoinColumn(
name = "RoleId",
referencedColumnName = "Id",
nullable = false),
inverseJoinColumns = @JoinColumn(
name = "BranchId",
referencedColumnName = "Id",
nullable = false))
public Set<Systembranches> getSystembranches() {
return systembrancheses;
}
public void setSystembranches(Set<Systembranches> systembrancheses) {
this.systembrancheses = systembrancheses;
}
}
正如您所看到的,通过第四个表(branchroles)连接的所有表在我的应用程序中没有实体。 该表包含以下数据:
id UserID BranchId RoleId
1 2 3 2
2 3 3 3
3 1 1 4
5 4 2 4
8 5 2 4
9 6 2 2
我需要获取一些实体(例如角色)的列表,依赖于该实体内的两个 Set<> 属性( Set<Systemusers>
和 Set<Systembranchs>
)
在 SQL 上它应该如下所示:
SELECT * FROM Userroles r
JOIN branchroles connector ON r.id = connector.RoleId
JOIN systembranches b ON b.id = connector.BranchId
JOIN systemusers u ON u.id = connector.UserId
WHERE u.id = 3 and b.id = 2
在我的 Java 代码中我写了
getSessionFactory().getCurrentSession()
.createCriteria(Userroles.class)
.createCriteria("systemusers")
.add(Restrictions.eq("id", userId))
.createCriteria("systembranches")
.add(Restrictions.eq("id", branchId))
.list();
以及其他类似的变体,例如
.createCriteria(Userroles.class, "r")
.createCriteria("r.systemusers", "u", JoinType.INNER_JOIN)
但是每次Hibernate都会生成这样的代码
正如您在此 SQL 中看到的,一个额外的 JOIN
结果下一个 JOIN
中的依赖项无效表达方式
我该如何解决这个问题?我想使用 Criteria API 编写代码,没有一对多关系,也没有 branchroles
实体,如果可能的话。你能帮忙吗?
谢谢
最佳答案
您的数据库结构中缺少某些内容。
如果您正在寻找多对多关系,则两个表之间可能存在这种关系。
一张表将包含您拥有的表的映射详细信息。
如果您想要使用三个表多对多,则需要将您的 JoinTable 视为应用程序中的实体表。
然后将其映射到具有多对多关系的第三个表。
希望这对你有帮助
关于java - hibernate 。三个表之间的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25155124/