2017-11-12 10 views
0

私は、Entity休止状態の怠惰なinitializaitionエラー、なぜ私は彼を持っていますか?

@Entity 
@Table(name = "products") 
public class Product { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @NotNull 
    @Column(name = "Id", unique = true) 
    private int id; 


    @NotNull 
    @Size(min = 5, max = 30) 
    @Column(name = "Name") 
    private String name; 


    @NotNull 
    @Column(name = "Price") 
    private double price; 

    @ManyToMany(mappedBy = "products",fetch = FetchType.LAZY) 
    private List<Order> orders; 

多対多のフィールドはタイプをフェッチLAZYでマークされています。 しかし、私は私のProductDAOに、この単純なコードを実行すると:

public List<Product> getProducts() { 
    List<Product> products; 
    String hql = "from Product"; 
    Session session = sessionFactory.openSession(); 
    products = session.createQuery(hql) 
      .list(); 
    session.close(); 
    return products; 
} 

私は怠け者initializaitionエラーを取得します。私は休止状態に慣れていないと私は、フェッチの種類が怠惰である場合、空のコレクションを持つProductオブジェクトを取得する必要があると思った。どこが間違っていますか?

+1

取得しているエラーメッセージは何ですか? –

+0

'コンテンツを書くことができませんでした:ロールのコレクションを遅延して初期化できませんでした:org.training.ytaranau.model.Product.orders、プロキシを初期化できませんでした - セッションなし ' – Fairy

+1

まあ、注文は遅れて読み込まれます。しかし、セッションは閉じられており、注文を反復しているときに製品がセッションから切り離されているため、Hibernateは遅延して注文を遅延させることはできません。 –

答えて

0

Hibernate Lazy Fetchタイプでは、初期の関係のエンティティ(レコード)はロードされません。 Lazy FetchのリレーションシップをロードするエンティティをHibernateセッションに関連付けるための@Transaction注釈が必要です。 NOTの場合、例外がスローされます。

Lazy Fetchタイプには@Transactionalを実装する必要があります。つまり、サービスメソッドに@Transactionalと注釈を付けて、LAZYフェッチを使用する必要があります。トランザクションを構成する必要があります。その他の解決方法はFetchType.EAGERに戻すことです。

関連する問題