спящий режим. много ко многим между тремя столами

1

всем привет

Сегодня я столкнулся с некоторыми проблемами... У меня есть 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;
    }

}

Как вы можете видеть, все таблицы объединены через четвертую таблицу (ветки), которые не имеют сущности в моем приложении. Эта таблица содержит следующие данные:

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

Как я могу это исправить? Я хочу написать код с использованием API критериев и без отношений "один ко многим" и без branchroles, если это возможно. Не могли бы вы помочь?

благодаря

Теги:
hibernate
orm
many-to-many

1 ответ

-1

В вашей структуре базы данных отсутствует что-то.

Если вы ищете отношения "многие ко многим", это может быть возможно между двумя таблицами.

В одной таблице будут отображаться детали, которые являются вашей собственной таблицей.

Если вы хотите перейти на три таблицы "Многим многим", то вам следует рассматривать ваш JoinTable как таблицу сущностей в приложении.

Затем сопоставьте его с третьей таблицей со многими для многих отношений.

Надеюсь, что это поможет вам

  • 0
    Спасибо за ответ. >> Рассматривайте Ваш JoinTable как таблицу сущностей в приложении. Как это может помочь?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню