JPA: таблица сопоставления, которая содержит некоторый внешний ключ - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть 4 таблицы:

  1. Пользователи - содержит данные пользователя
  2. Модули - словарь с уникальными «Именами модулей»
  3. Modules_Access_Rules - словарь всех "правил модуля"
  4. j_Users_Modules_Rule - таблица, которая связывает три предыдущих (см. Схему)

enter image description here

У меня есть объект, который содержит 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 таблица:

enter image description here

Я понимаю, что я присоединяюсь к таблицам дважды ( Пользователь -> 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  
...