@ManyToMany не все значения, полученные из БД - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть пользователь проекта, у которого есть полномочия.Типы полномочий, хранящиеся в базе данных и связанные с пользователем как отношение «многие ко многим».

    @ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "uauth_user"), inverseJoinColumns = @JoinColumn(name = "uauth_authority"))
private Set<Authority> userAuthorities;

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

Я уже проверяю базу данных, и она хранит эти данные.Также я нашел решение с добавлением одной не JPA аннотации.Он работает с @Fetch(FetchMode.SUBSELECT), но я все еще не понимаю, что с ним не так.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Следующее решение работает в любой реализации, совместимой с JPA 2.0.

Таблица user имеет первичный ключ id.

Таблица authority имеет первичный ключ id.

Таблица user_authority имеет поля user_id, authority_id.

Класс сущности Пользователь

@JoinTable(name = "user_authority", 
    joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},  
    inverseJoinColumns = {@JoinColumn(name = "authority_id", referencedColumnName = "id")})
@ManyToMany(fetch = FetchType.EAGER)
private Set<Authority> authoritySet;

Класс сущности Полномочия

@ManyToMany(mappedBy = "authoritySet", fetch = FetchType.EAGER)
private Set<User> userSet;

Таблица user_authority не имеет представления сущности в JPA.

0 голосов
/ 23 февраля 2012

Хорошо, проблема была в другом месте.

Моя ошибка состояла в том, что когда я попробовал это с аннотацией Hibernate, и она просто работает, я начал думать, что это проблема аннотации, но на самом деле это было вызвано способом получения этих значений.

При рефакторинге мы оставляем в коде одну ошибку:

return (T) criteria.setMaxResults(1).uniqueResult();

Он устанавливает максимальное количество результатов равным 1, и в нашем случае оно преобразуется в SQL как

SELECT * FROM user OUTER JOIN user_authority ON usr_id = uauth_user INNER JOIN authority ON uauth_authority = auth_id LIMIT 1

Это ограничение снимает все полномочияи оставьте только первый авторитет с первой строки.Но когда мы указываем Hibernate FetchMode как SUBSELECT.Он выполняет это get в двух отдельных SQL-запросах.В котором только основной имеют предел.

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