我有这种方法无状态会话bean:'没有会话或会话关闭' 与JPA 2和EJB 3.1
@Override
public List<Character> getUserCharacters(int userId) {
User user = em.find(User.class, userId);
if(user != null)
return user.getCharacters();
else
return null;
}
其中,如果以这种方式定义User
类:
@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
豆)我收到异常:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.AandP.game.model.User.characters, no session or session was closed
根据t o JPA 2.0规范会话应该在整个事务中保持活跃状态。在这种情况下,交易(在我看来)持续整个方法调用(在类或方法上没有额外的事务属性)。
所以问题是:这段代码有什么问题,以及如何以懒惰的方式加载类属性。
我应该使用哪一种'TransactionAttributeType'?Javadocs说:_如果没有指定TransactionAttribute注解,并且bean使用容器管理的事务分界,则假定REQUIRED事务属性的语义。因此,我认为没有'TransactionAttribute'注释的注释方法是可以的。 – pWoz 2012-03-09 07:55:53
Bozho能解释吗? – pWoz 2012-03-15 15:03:17
否:)可能会有另一个子句提到只读事务。但是添加一个TransactionAttribute的工作? – Bozho 2012-03-15 16:05:52