私は春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方法については
@transactionalを追加すると、データベースから詳細が取得されますが、それは必要ありません。私は怠惰なローディングを利用したい – shubh
私の理解は、hibernateがその周囲にプロキシオブジェクトを作成する前に、コード内のbeanBにアクセスするとデータベースからフェッチすることだけです。 – vampYr09
3.5で導入されたフェッチプロファイルhibernateを追加しようとしましたか? http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetch-profiles – vampYr09