2017-08-18 10 views
0

私は春MVC + hibernate + jacksonを使用しています。 春バージョン:4.3.x Hibernateバージョン:4.3.x BeanBオブジェクトをフェッチしている間にBeanBオブジェクトをフェッチするAPIを2つ作成したいと思います。私は同じのfetchtype.lazyを使用しています。hibernateとspringを使用して遅延読み込みオブジェクトを取得または無視する適切な方法はありますか?

私は豆を以下している:私のコントローラで

@Entity 
class BeanA 
{ 

@Id 
int id; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "BeanB_id") 
private BeanB beanB; 


//getters and setters 
} 

@Entity 
class BeanB 
{ 

@Id 
int i; 

//getters and setters 
} 

を、私は二つの方法があります:(。質問を小さくするために、サービス層を除去し、私のサービス層クラスでは、私は@Transactionalを持っている)

@RequestMapping(value = "/beanA/{id}" , method=RequestMethod.GET) 
    public ResponseEntity<BeanA> findDetailedBeanAById(@PathVariable("id") int id) 
    { 
     // to return beanA object with beanB 
     BeanA beanA = beanADao.findDetailedBeanAById(id);  
     return new ResponseEntity<BeanA>(beanA, HttpStatus.OK); 
    } 

@RequestMapping(value = "/beanA/{id}" , method=RequestMethod.GET) 
    public ResponseEntity<BeanA> findNonDetailedBeanAById(@PathVariable("id") int id) 
    { 
     // to return beanA object without beanB 
     BeanA beanA = beanADao.findNonDetailedBeanAById(id);   
     return new ResponseEntity<BeanA>(beanA, HttpStatus.OK); 
    } 
マイダオで

public BeanA findDetailedBeanAById(long id) { 


     BeanA beanA = (BeanA) getSession().get(BeanA.class, id); 
     Hibernate.initialize(beanA.getBeanB()) 
     return beanA; 
    } 

public BeanA findNonDetailedBeanAById(long id) { 

    BeanA beanA = (BeanA) getSession().get(BeanA.class, id);   
    return beanA; 
} 

私はfindNonDetailedBeanAByIdコントローラMETを打っていますHOD、私のようにエラーを取得しています:

行われるために必要とされているどのような変更
org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)` 

:私はfindNonDetailedBeanAByIdコントローラメソッドを打つていた場合

org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: could not initialize proxy - no Session 

、私はエラーを取得していますか?

私はあなたがで@Transactional(読み取り専用= true)を追加する必要があると思うあなたはカスタムクエリを構築し、怠惰なfindBy方法について getSession().createQuery("SELECT a FROM beanA a LEFT JOIN FETCH a.beanB WHERE a.id == :id")

のように、クエリの内部でbeanBを取り出すことができ、詳細なfindBy方法については

答えて

0

トランザクションレベルの注釈を付けられたサービスを取得した後にBeanAを使用しようとしているため、コントローラレベルです。私はそれがデータベースからBeanBをフェッチしようとしていると思うが、休止状態のセッションは既に閉じられているかもしれない。

私は電話でしかないので、私の提案を試すことができませんでした。

+0

@transactionalを追加すると、データベースから詳細が取得されますが、それは必要ありません。私は怠惰なローディングを利用したい – shubh

+0

私の理解は、hibernateがその周囲にプロキシオブジェクトを作成する前に、コード内のbeanBにアクセスするとデータベースからフェッチすることだけです。 – vampYr09

+0

3.5で導入されたフェッチプロファイルhibernateを追加しようとしましたか? http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetch-profiles – vampYr09

関連する問題