#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. Я перепробовал множество вариантов, но до сих пор не нашел решения.