私はこの方法でステートレスセッション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
beanから)、私は例外を受け取ります:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.AandP.game.model.User.characters, no session or session was closed
o JPA 2.0仕様セッションは、トランザクション全体で生き続ける必要があります。この状況では、トランザクションは(私の意見では)メソッド呼び出し全体の最後になります(クラスまたはメソッドに追加のトランザクション属性はありません)。
このコードで何が問題になっているのですか?クラスプロパティを怠け者で読み込むにはどうすればよいですか。
「TransactionAttributeType」はどちらを使用しますか?Javadocsは次のように述べています:TransactionAttributeアノテーションが指定されておらず、Beanがコンテナ管理のトランザクション境界を使用している場合、REQUIREDトランザクション属性のセマンティクスが仮定されます。_したがって、TransactionAttributeアノテーションを付けないアノテーションメソッドはOKです。 – pWoz
Bozhoあなたはそれを説明できますか? – pWoz
いいえ:)読取り専用トランザクションに言及する別の節があるかもしれません。しかし、TransactionAttributeを追加することはできますか? – Bozho