Спящий режим. много ко многим между тремя столами
всем привет
Сегодня я столкнулся с некоторой проблемой... У меня есть 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 генерирует такой код
Как вы можете видеть в этом SQL один дополнительный JOIN
и как результат недопустимая зависимость в следующем JOIN
выражение
Как я могу это исправить? Я хочу написать код с использованием Criteria API и без отношений один-ко-многим и без branchroles
сущность, если это возможно. Не могли бы вы помочь?
Спасибо
1 ответ
Вы упустили что-то в своей структуре базы данных.
Если вы ищете отношения "Много ко многим", то это возможно между двумя таблицами.
В одной таблице будет отображаться деталь, которая является вашей собственной таблицей.
Если вы хотите перейти к трем таблицам "Много ко многим", вам нужно рассматривать свой JoinTable как таблицу сущностей в приложении.
Затем сопоставьте его с третьей таблицей, в которой отношения "многие ко многим".
Надеюсь, что это поможет вам