2014-10-23 2 views
0

Я получаю следующую ошибку: когда я пытаюсь сохранить свои данные.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} переменная):

Так как я могу распечатать роль пользователей (например: обычный пользователь, администратор)?

ответ

0

Ваша сессия доступна только для выполнения вашего Criteria. После этого он закрыт, и он недоступен. Проксированные поля зависят от сеанса, который будет восстановлен позже, но поскольку сеанс уже закрыт, вы получите сообщение об ошибке около LazyInitializationException.

Чтобы решить эту проблему, извлеките данные, пока сессия все еще открыта, или не помечены такими полями, как FetchType.LAZY.

+0

О, я понимаю. Любая идея, как я могу ее решить? – Roberto

+0

@Roberto * Чтобы решить эту проблему, извлеките данные, пока сессия все еще открыта, или не помечать такие поля, как 'FetchType.LAZY' *. –

+0

Но если я изменю его на FetchType.EAGER, каждый пользователь с ролью администратора будет иметь две записи: user1, admin1, admin1, user2, user3, admin2, admin2 – Roberto

0

Из ваших комментариев относительно ответа от @Luiggi Mendoza кажется, что вам просто нужно держать свои сеансы открытыми дольше. Взгляните на this answer на очень похожий вопрос. Решение состоит в том, чтобы изменить вашу конфигурацию, чтобы ваша сессия длилась всю жизнь, а именно:

<property name="current_session_context_class">thread</property> 
Смежные вопросы