У меня есть 4 таблицы:
- Пользователи - содержит данные пользователя
- Модули - словарь с уникальными «Именами модулей»
- Modules_Access_Rules - словарь всех "правил модуля"
- j_Users_Modules_Rule - таблица, которая связывает три предыдущих (см. Схему)
У меня есть объект, который содержит Set<Modul>
-> Modul
, связанный с User
, как @OneToMany
,Modul
содержит Set<ModuleRule>
-> также @OneToMany
.Я пытаюсь использовать Spring-Data-JPA-Mapping
для связывания Users
с Modules
и с Modules Rules
:
@Entity
@Table(name = "Users")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private int id;
@OneToMany
@JoinTable(
name = "j_Users_Modules_Rule",
joinColumns = {
@JoinColumn(name="id_Module",referencedColumnName="id"),
},
inverseJoinColumns = {
@JoinColumn(name="id_rule",referencedColumnName="id")
}
)
@ElementCollection(fetch = FetchType.EAGER)
private Set<Module> authorities;
// Getters and Setters
}
, модульной сущностью:
@Entity
@Table(name = "Modules")
public class Module implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private long id;
@Column(name = "name", nullable = false)
private String name;
@OneToMany
@JoinTable(
name = "j_Users_Modules_Rule",
joinColumns = {
@JoinColumn(name="id_Module",referencedColumnName="id"),
},
inverseJoinColumns = {
@JoinColumn(name="id_rule",referencedColumnName="id")
}
)
@ElementCollection(fetch = FetchType.EAGER)
private Set<ModuleRule> moduleRules;
//Getters and Setters
}
и сущностью ModuleRule:
@Entity
@Table(name = "Modules_access_rules")
public class ModuleRule implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private long id;
@Column(name = "name", nullable = false)
private String name;
// Getters and Setters
}
Я правильно (по бизнес-требованиям) получаю Пользователь с Модулями и ModuleRules , но при сохранении User
результат неверныйв j_Users_Modules_Rule таблица:
Я понимаю, что я присоединяюсь к таблицам дважды ( Пользователь -> Module , Module -> ModuleRule ), но я не знаю, как правильное значение save
в j_Users_Modules_Rule таблице.
Я еще не нашел решения и использую Spring JdbcTemplate
(для обработки набора результатов используется ResultSetExtractor
).
Запрос :
SELECT
U.*, J.id_Module, M.name AS name_Module,
J.id_Rule, R.name AS name_Rule
FROM
dbo.[Users] U (nolock)
JOIN
dbo.j_Users_Modules_Rule J (nolock) ON U.id = J.id_User
JOIN
dbo.Modules M (nolock) ON M.id = J.id_Module
JOIN
dbo.Modules_Access_Rules R (nolock) ON R.id = J.id_Rule