1

安らかなインターフェースを使用してすべての製品をリストしようとしているとしましょう。

    @XmlRootElement
    public class Product implements Serializable {

    //products attributes defined here

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="product")
    private Set<ProductUser> productUsers= new HashSet<ProductUser>();
}

製品でfind.Allを呼び出そうとすると、ProductUsersもフェッチしようとして例外がスローされます

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role, productUsers, no session or session was closed

製品ユーザーを残りの xml 出力に含めたくありません。xml に含まれるものを選択的に選択するにはどうすればよいですか?

REST-Easy、JBoss AS7、JPA を実装として Hibernate と共に使用しています。私の EJB 3.1 メソッドは、Restful サービスとして公開されています。

あなたの助けに感謝!

4

1 に答える 1

3

1 つのクラスに JAXB と JPA を混在させることはお勧めしません。

JPA エンティティには、独自の特別なライフサイクルがあります。パブリック EJB メソッドから JPA エンティティを返す場合、ほとんどの場合、切り離されます。REST Resource クラスは EJB であると想定しています。デフォルトでは、トランザクションは public EJB メソッドの呼び出しで開始および終了するため、JPA エンティティは分離されています。詳細については、TransactionAttributeの JavaDoc を参照してください。JPA エンティティが分離されている場合、遅延読み込みは機能しなくなります。それがあなたの問題です。

JPAエンティティとJAXBエンティティに別々のクラスを用意することをお勧めします。さらに、トランザクション コンテキストから JPA エンティティを返さないことをお勧めします。したがって、JPA エンティティのデタッチ/マージに対処する必要はありません。遅延読み込みの問題はすべて過去のものになります。これを実現するには、トランザクション内 (パブリック EJB メソッド内) で JPA エンティティを手動で JAXB エンティティに変換し、JAXB エンティティを返す必要があります。

GET メソッドは次のようになります。

@GET
@Produces("application/xml")
public JaxbProduct get(@PathParam("id") int id) {
    JpaProduct product = entityManager.find(JpaProduct.class, id);
    JaxbProduct result = new JaxbProduct();
    result.setPropertyX(product.getPropertyX());
    return result;
}

JPA エンティティを JAXB エンティティに手動で変換することにより、出力に何が含まれ、何が含まれないかを完全に制御できます。

于 2012-03-06T23:13:08.720 に答える