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

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

Необходимо отобразить текущему пользователю список курсов, содержащих хотя бы одну группу пользователя.
Проблемы:
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
12.07.2018, 12:55
    #39673081
b35.5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
если есть возможность покритиковать подход в принципе, "поделюсь" ссылкой на сотворенное..)
...
Рейтинг: 0 / 0
12.07.2018, 15:06
    #39673179
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
b35.5,

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

@ManyToMany ?!

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

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

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

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

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

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

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

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

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

Так никто не мешает в репозитории Spring Data Jpa написать нативный запрос. ;-)
Главное, чтобы запрос возвращал поля точно такие-же как в Entity
...
Рейтинг: 0 / 0
16.07.2018, 12:30
    #39674443
b35.5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot + Freemarker. @ManyToMany,@AuthenticationPrincipal User u. и разделение прав / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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