Mutiple @ManyToMany для одной сущности вызывает перекрестное соединение - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть пользовательский объект.

@Entity
@Table(name = "t_login_user")
public class User  extends Auditable<Long> implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private Long id;

    @Column(name = "user_uid")
    private String userUid;

    @Column(name = "user_name")
    private String userName;

    @OneToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name="primary_role_id")
    private Role primaryRole;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "t_login_user_role_map", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private List<Role> roles;

}

Моя роль -

@Entity
@Table(name = "t_login_role")
public class Role extends Auditable<Long> implements Serializable {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="role_id")
private Long roleId;

@Column(name="role_code")
private String roleCode;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "t_login_role_priv_map", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "priv_id"))
private List<Privilege> privileges;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "t_login_role_menu_map", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "menu_id"))
private List<Menu> menus;

}

Мое меню:

@Entity
@Table(name = "t_login_menu")
public class Menu extends Auditable<Long> implements Serializable{


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private Long id;

    @Column(name="menu_text")
    private String menuText;

    @Column(name="menu_icon")
    private String menuIcon;

    @Column(name="menu_url")
    private String menuURL;


}

Как видите, моя роль имеет несколько привилегий и несколько меню. Проблема, с которой я сталкиваюсь, заключается в том, что когда у меня есть код, такой как

LoggedinUser liu = (LoggedinUser)authentication.getPrincipal();
List<Menu> menus = liu.getPrimaryRole().getMenus();

Если у меня есть две привилегии, скажем READ_DATA и WRITE_DATA И три Меню 1. ДОМ 2. ПОЛЬЗОВАТЕЛЬ 3. ПРОФИЛЬ

Моя переменная меню имеет значение [HOME, HOME, USER, USER, PROFILE, PROFILE] (то есть 2 привилегии * 3 роли)

Я подозреваю, что это связано с тем, что у моей сущности Role есть несколько аннотаций @ManyToMany.

Я пытался искать онлайн и Stackoverflow, но безрезультатно. Кто-нибудь сталкивался с этой проблемой? Я делаю что-то в корне неправильно?

1 Ответ

0 голосов
/ 04 апреля 2019

Хорошо.Я понимаю, где происходит перекрестное соединение.Поскольку оба ManyToMany загружаются EAGER, именно здесь происходит перекрестное соединение.

Если я переключусь на LAZY Load, проблема исчезнет.Небольшая производительность отразилась на LAZY-нагрузке, но это нормально, поскольку я делаю это только один раз и сохраняю результат в сеансе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...