powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
15 сообщений из 15, страница 1 из 1
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673075
b35.5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Направьте в нужном направлении, не могу сообразить.

Есть сущности пользователи, группы пользователей, курсы.
Пользователю можно указать несколько групп.
Курсу можно указать несколько групп.
И собственно справочник групп пользователей.

Необходимо отобразить текущему пользователю список курсов, содержащих хотя бы одну группу пользователя.
Проблемы:
1. как корректно выполнять связку пользователя с группами (используя все блага Spring Boot)? Пробовал @OneToMany и @ManyToMany (по примерам видно), вроде как работает и так и так. Как корректно получать данные из базы когда связь идет через промежуточную таблицу. Могу вытащить данные select -ом, но наверно это не самый оптимальный вариант. Нужно ли в сущности, которая является справочником делать ссылку на сущности использующие ее?

2. Если получить текущего пользователя в контроллере через @AuthenticationPrincipal User user, то значение Set<UserGroup> userGroups; содержит ошибку "Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception."
Попытался получить пользователя через userRepo.findByUsername(user), тогда возникает проблема №3.

3. При получении пользователя по логину в контроллере через @AuthenticationPrincipal User user, то возникают проблемы после разлогинивания, повторно залогиниться не получается. Есть ощущение что сессия в базе зависает.

4. Пытался в шаблонах Freemarker отображать в <#list > только те курсы, который содержат группы как у текущего пользователя через ?seq_contains(...). Но пока тоже неуспешно.

За основной пример брал этот проект

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@Entity
@Table(name = "USR")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(unique = true)
    private String username;    
    private boolean active;

    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "USR_ROLE", joinColumns = @JoinColumn(name = "USR_ID"))
    @Enumerated(EnumType.STRING)
    private Set<Role> roles;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "USRGROUPID")
    private Set<UserGroup> userGroups;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Entity
@Table
public class UserGroup {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String userGroupName;
    private boolean active;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Entity
@Table(name = "COURSE")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String coursename;
    private String coursedescription;
    private boolean active;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "COURSETOUSRGROUP",
            joinColumns = {@JoinColumn(name = "USRGROUPID")},
            inverseJoinColumns = {@JoinColumn(name = "COURSEUSRGROUPID")})
    private Set<UserGroup> userGroups = new HashSet<>();
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673081
b35.5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если есть возможность покритиковать подход в принципе, "поделюсь" ссылкой на сотворенное..)
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673179
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b35.5,

@ManyToMany ?!
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673294
b35.5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgulb35.5,

@ManyToMany ?!

Так получилось, что я вроде как все сделал почти как по букварю, до того как нашел эту же ссылку. Гуглю 2дня, перебираю варианты, но пока не понимаю.

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

А в другом месте не работает. Это и сбивает с толку.
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673589
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b35.5,

Тут я вам вряд ли помогу.
Т.к. при возникновении таких проблем перестаю использовать ORM, а просто пишу нужный запрос.
Который будет выполняться в NativeQuery :-)
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673597
b35.5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul,

Да были мысли уже по этому поводу. Написать запрос гораздо проще), а хочется сперва именно возможности Spring boot освоить.
Читаю пока статьи/документацию, ответ пока не нашел, но по пути еще много полезного подхватил.
Спасибо за участие! (найду решение проблемы, отпишусь).
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673710
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b35.5mad_nazgul,

Да были мысли уже по этому поводу. Написать запрос гораздо проще), а хочется сперва именно возможности Spring boot освоить.
Читаю пока статьи/документацию, ответ пока не нашел, но по пути еще много полезного подхватил.
Спасибо за участие! (найду решение проблемы, отпишусь).

При чем тут Spring Boot?
Spring Boot никоим образом не запрещает использовать нативные SQL запросы.
См. JdbcTemplate
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673723
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulне запрещает использовать нативные SQLон ищет нативные ОРМ навигации по объектам.
Думаю, что sql написать всегда успеет.
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673735
b35.5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Да, да. select-ом я вытащу данные без проблем.
первая итерация знакомства с web - была на "голых" сервлетах. Дальше дали возможные "направления", Spring Boot показался наиболее "простым" в восприятии и интуитивно понятным.
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673767
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно, там где не работает - сессия хибернейта уже закрыта
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673771
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Вероятно, там где не работает - сессия хибернейта уже закрыта
Трассируй. Или вернись к хиберу и убедись что работает.
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673815
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
Я свои уже оттрасировал, пора и отдохнуть
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39673871
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,
Звиняй, это ТСу))
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39674300
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b35.5Petro123,

Да, да. select-ом я вытащу данные без проблем.
первая итерация знакомства с web - была на "голых" сервлетах. Дальше дали возможные "направления", Spring Boot показался наиболее "простым" в восприятии и интуитивно понятным.

Так никто не мешает в репозитории Spring Data Jpa написать нативный запрос. ;-)
Главное, чтобы запрос возвращал поля точно такие-же как в Entity
...
Рейтинг: 0 / 0
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
    #39674443
b35.5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul,

В общем решил проблему, нужна была всего одна строка.
Код: java
1.
private static final long serialVersionUID = -8706689714326132798L;


Переписал в двух сущностях @ManyToMany (...цатый раз).
При авторизации возникала ошибка про сериализацию в UserGroup
Вспомнил с видеоуроков stepick про магическую строку с
Код: java
1.
serialVersionUID


Теперь
Код: java
1.
2.
3.
@GetMapping("/main")
    public String main(Model model,
                       @AuthenticationPrincipal User user) {


Возвращает user и подтягивает userGroup

Рабочий вариант
===============================
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
@Entity
@Table(name = "USR")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(unique = true)
    private String username; 
    private boolean active;

    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "USR_ROLE", joinColumns = @JoinColumn(name = "USR_ID"))
    @Enumerated(EnumType.STRING)
    private Set<Role> roles;

    @ManyToMany(fetch = FetchType.EAGER,
            cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "USR_TO_GROUP",
            joinColumns = @JoinColumn(name = "USRID"),
            inverseJoinColumns = @JoinColumn(name = "GROUPID"))
    private Set<UserGroup> groups;




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Entity
@Table(name = "USR_GROUP")
public class UserGroup implements Serializable {
    private static final long serialVersionUID = -8706689714326132798L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String userGroupName;
    private boolean active;

    @ManyToMany(mappedBy = "groups")
    private Set<User> users = new HashSet<>();
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]