2017-11-14 3 views
0

私は結果を得るためにHibernateメソッドと呼ばれるRestサービスからのコントローラを持っていますが、なぜ子コンポーネントが来なかったのか分かりません。 Junitを使ってこのメソッドを呼び出すと、動作します。デフォルト@OneToManyことで親は子を取得しません。hibertnate JPA

{ 

@Entity 
public class Product implements Serializable { 
    private static final long serialVersionUID = -6131311050358241535L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column(nullable = false) 
    private String name; 

    private String description; 


    @OneToMany(mappedBy = "product") 
    private List<Image> images = new ArrayList<Image>(); 
} 


{ 

@Entity 
public class Image implements Serializable { 

    private static final long serialVersionUID = 2128787860415180858L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @JoinColumn(name = "product_id") 
    @ManyToOne 
    private Product product; 

    private ImageType type; 
} 
{ 

@PersistenceContext 
private EntityManager entityManager; 

public List<Product> findAllWithParentProductsAndImage() { 
String hpql = "select distinct p from Product p left join fetch p.images"; 
List<Product> resultList = entityManager.createQuery(hpql, 
     Product.class).getResultList(); 
return resultList; 
} 
} 
+0

あなたがlaziily子供をロードしていないことを確認するためにチェックしましたか? –

+0

サービスの@Transaction(readOnly = true)をラップすると、遅延読み込みの子を遅延的にアクセスできるようになります。 –

答えて

1

を遅延ロードします: これはコードです。 あなたは間違いなく

@OneToMany(mappedBy = "product", fetch=FetchType.Eager) 

を使用することができますイーガーフェッチ

+0

これは、親だけが必要な場合でも常に子をフェッチします。 –

0

を行うために@OneToMany( mappedBy = "product", fetch=FetchType.Eager)を使用する必要がありますしかし、これは欠点があります。 とそのいくつかのプロパティが必要な場合でも、常に子をフェッチします。

JOIN FETCHをご使用の場合は、@Queryを使用してください(JpaRepositoriesを使用している場合)。

次の関連の質問をチェック

関連する問題