Роли и привилегии гибернации

#hibernate #hibernate-mapping #hibernate-criteria

Вопрос:

Я пытаюсь реализовать роли и привилегии. Но я получаю сообщение об ошибке сеанса:

Ошибка обработки запроса сообщения; вложенное исключение-org.hibernate.Исключение LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: com.testmany.shop.entity.Полномочия.Привилегии, не удалось инициализировать прокси — нет сеанса

Пожалуйста, скажите мне, что я делаю не так? Я не нашел решения в Интернете. Я не могу решить эту проблему в течение двух дней.

https://github.com/MyTestPerson/TestMany

Вот как я создаю пользователя..

     PrivilegesEntity privilegesEntity = serviceJpa.findPrivilegesEntityByPrivilegeEnum("PRIVILEGE_EDIT");
    AuthoritiesEntity authoritiesEntity = serviceJpa.findAuthoritiesEntityByRoleEnum("ROLE_USER");

    privilegesEntity.addAuthority(authoritiesEntity);
    authoritiesEntity.addUser(userEntity);

    serviceJpa.savePrivilegesEntity(privilegesEntity);
 

введите описание изображения здесь

UserEntity.class

     @Entity(name = "UserEntity")
    @Table(name = "users", schema = "test")
    public class UserEntity implements Serializable {



        private Long id;
        private String email;
        private String password;
        private Collection<AuthoritiesEntity> authoritiesEntities = new ArrayList<>();




        // id
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", nullable = false, unique = true)
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }




        // email
        @NaturalId
        @Column(name = "email", nullable = false, unique = true, length = 45)
        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }




        // password
        @Column(name = "password", nullable = false, length = 65)
        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }





        @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
        public Collection<AuthoritiesEntity> getAuthoritiesEntities() {
            return authoritiesEntities;
        }

        public void setAuthoritiesEntities(Collection<AuthoritiesEntity> authoritiesEntities) {
            this.authoritiesEntities = authoritiesEntities;
        }



    }
 

AuthoritiesEntity.class

     @Entity(name = "AuthoritiesEntity")
    @Table(name = "authorities", schema = "testmany")
    public class AuthoritiesEntity implements Serializable{

        private Long id;
        private String authority;
        private Collection<UserEntity> userEntityList = new ArrayList<>();
        private Collection<PrivilegesEntity> privilegesEntities = new ArrayList<>();




        // id
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", nullable = false, unique = true)
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }





        // role
        @Column(name = "authority", nullable = false, unique = true, length = 45, insertable = false, updatable = false)
        public String getAuthority() {
            return authority;
        }

        public void setAuthority(String authority) {
            this.authority = authority;
        }





        

        @ManyToMany(mappedBy = "authoritiesEntities", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
        public Collection<UserEntity> getUserEntityList() {
            return userEntityList;
        }

        public void setUserEntityList(Collection<UserEntity> userEntityList) {
            this.userEntityList = userEntityList;
        }





        @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
        public Collection<PrivilegesEntity> getPrivilegesEntities() {
            return privilegesEntities;
        }

        public void setPrivilegesEntities(Collection<PrivilegesEntity> privilegesEntities) {
            this.privilegesEntities = privilegesEntities;
        }






        // addUser
        public void addUser(UserEntity userEntity) {
            userEntityList.add( userEntity );
            userEntity.getAuthoritiesEntities().add( this );
        }





    }
 

PrivilegesEntity.class

     package com.testmany.shop.entity;

    import com.testmany.shop.enam.PrivilegeEnum;

    import javax.persistence.*;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;

    @Entity(name = "PrivilegesEntity")
    @Table(name = "privileges", schema = "testmany")
    public class PrivilegesEntity implements Serializable {



        private Long id;
        private String privilege;
        private Collection<AuthoritiesEntity> authoritiesEntityList = new ArrayList<>();




        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", nullable = false, unique = true)
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }








        @Column(name = "privilege", nullable = false, unique = true, length = 45, insertable = false, updatable = false)
        public String getPrivilege() {
            return privilege;
        }

        public void setPrivilege(String privilege) {
            this.privilege = privilege;
        }








        @ManyToMany(mappedBy = "privilegesEntities", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
        public Collection<AuthoritiesEntity> getAuthoritiesEntityList() {
            return authoritiesEntityList;
        }

        public void setAuthoritiesEntityList(Collection<AuthoritiesEntity> authoritiesEntityList) {
            this.authoritiesEntityList = authoritiesEntityList;
        }









        // addAuthority
        public void addAuthority(AuthoritiesEntity authoritiesEntity) {
            authoritiesEntityList.add( authoritiesEntity );
            authoritiesEntity.getPrivilegesEntities().add( this );
        }



    }
 

Ответ №1:

Если вы будете искать вопросы о LazyInitializationException себе, вы найдете массу вопросов с ответами, которые объясняют, почему вы получили это исключение и как вы можете это решить. Короче говоря, менеджер сущностей, к которому подключен прокси-сервер ленивой коллекции privilegesEntities , больше недоступен. Самое простое решение и в вашем случае также, вероятно, наиболее подходящее-разрешить транзакции (к которой привязан EntityManager) охватывать весь метод, аннотируя метод с помощью @Transactional

Комментарии:

1. Я перепробовал множество вариантов, но до сих пор не нашел решения.