Я получаю следующую ошибку: когда я пытаюсь сохранить свои данные.Hibernate: не удалось лениво инициализировать коллекцию
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.test.model.User.userRole, could not initialize proxy - no Session
Я перечислил классы, которые я использовал.
User.java:
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "users", catalog = "test")
public class User {
private String username;
private String password;
private boolean enabled;
private Set<UserRole> userRole = new HashSet<UserRole>(0);
public User() {
}
public User(String username, String password, boolean enabled) {
this.username = username;
this.password = password;
this.enabled = enabled;
}
public User(String username, String password,
boolean enabled, Set<UserRole> userRole) {
this.username = username;
this.password = password;
this.enabled = enabled;
this.userRole = userRole;
}
@Id
@Column(name = "username", unique = true,
nullable = false, length = 45)
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "password",
nullable = false, length = 60)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "enabled", nullable = false)
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserRole> getUserRole() {
return this.userRole;
}
public void setUserRole(Set<UserRole> userRole) {
this.userRole = userRole;
}
}
И UserRole.java:
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "user_roles", catalog = "test", uniqueConstraints = UniqueConstraint(columnNames = { "role", "username" }))
public class UserRole{
private Integer userRoleId;
private User user;
private String role;
public UserRole() {
}
public UserRole(User user, String role) {
this.user = user;
this.role = role;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_role_id",
unique = true, nullable = false)
public Integer getUserRoleId() {
return this.userRoleId;
}
public void setUserRoleId(Integer userRoleId) {
this.userRoleId = userRoleId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username", nullable = false)
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
@Column(name = "role", nullable = false, length = 45)
public String getRole() {
return this.role;
}
public void setRole(String role) {
this.role = role;
}
}
И у меня есть Dao Реализовано:
@Transactional
@Override
@SuppressWarnings("unchecked")
public List<User> listUsers() {
return this.sessionFactory.getCurrentSession()
.createCriteria(User.class).list();
}
Я перечисляю всех пользователей в моем контроллер с методом listUsers. И добавьте с model.addObject («users», listUsers) ;.
В представлении я использую следующий код:
<c:forEach items="${users}" var="user">
Username: ${user.username}
Pass: ${user.password}
Role: ${user.userRole}
</c:foreEach>
Но я получил вышеуказанную ошибку (из-за $ {user.userRole} переменная):
Так как я могу распечатать роль пользователей (например: обычный пользователь, администратор)?
О, я понимаю. Любая идея, как я могу ее решить? – Roberto
@Roberto * Чтобы решить эту проблему, извлеките данные, пока сессия все еще открыта, или не помечать такие поля, как 'FetchType.LAZY' *. –
Но если я изменю его на FetchType.EAGER, каждый пользователь с ролью администратора будет иметь две записи: user1, admin1, admin1, user2, user3, admin2, admin2 – Roberto