java - hibernate 。三个表之间的多对多

标签 java sql hibernate orm many-to-many

大家好

今天我遇到了一些麻烦...... 我有 3 个表,每个表之间都有多对多关系。请参阅下面的链接

diagram

下面是实体的简短定义: 分支机构

@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都会生成这样的代码

Hibernate SQL

正如您在此 SQL 中看到的,一个额外的 JOIN结果下一个 JOIN 中的依赖项无效表达方式

我该如何解决这个问题?我想使用 Criteria API 编写代码,没有一对多关系,也没有 branchroles实体,如果可能的话。你能帮忙吗?

谢谢

最佳答案

您的数据库结构中缺少某些内容。

如果您正在寻找多对多关系,则两个表之间可能存在这种关系。

一张表将包含您拥有的表的映射详细信息。

如果您想要使用三个表多对多,则需要将您的 JoinTable 视为应用程序中的实体表。

然后将其映射到具有多对多关系的第三个表。

希望这对你有帮助

关于java - hibernate 。三个表之间的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25155124/

相关文章:

JavaScript 转义序列

java - 使用外部 JS 文件更改 Servlet 的 HTML 输出

mysql - 重新排序 MySQL 表中的行

sql - Ms-Access 中的 IIF 语句

java - spring boot/hibernate查询结果花费太多时间

java - JPA - 实体对象持续存在到底意味着什么?坚持的定义是什么?

java - Gradle - 一个项目,多个包,多个jar

java - 初学者问: How do I get my android app to compile in Eclipse?

mysql - ACL 类 SQL 匹配

java - JPA直接返回query.getSingleResult()时返回null