У меня есть сессионный компонент без сохранения состояния с этим методом:
@Override
public List<Character> getUserCharacters(int userId) {
User user = em.find(User.class, userId);
if(user != null)
return user.getCharacters();
else
return null;
}
, где User
class, если определен таким образом:
@Entity
@Table(name="Users")
public class User implements Serializable{
/** */
private static final long serialVersionUID = 8119486011976039947L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int id;
@ManyToMany(fetch=FetchType.EAGER)
private Set<Role> roles;
@OneToMany(mappedBy="owner",fetch=FetchType.LAZY)
private List<com.AandP.game.model.characters.Character> characters;
public User() {
creationDate = new Date();
roles = new HashSet<Role>();
}
}
Но когда я выполняю этот метод (из моего@Named
bean) я получаю исключение:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.AandP.game.model.User.characters, no session or session was closed
В соответствии со спецификацией JPA 2.0 сеанс должен оставаться в живых в течение всей транзакции.В этой ситуации транзакция (на мой взгляд) продолжается для всего вызова метода (нет дополнительных атрибутов транзакции для класса или метода).
Таким образом, вопрос заключается в следующем: что не так с этим кодом и как я могу загрузитьсвойства класса ленивым способом.