我正在使用spring MVC + hibernate + jackson。 春季版:4.3.x Hibernate版本:4.3.x 我想创建两个API-one获取BeanB对象,而一个不提取BeanB对象。我正在使用fetchtype.lazy。
我有以下豆子:
@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控制器方法时,我收到错误:
org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: could not initialize proxy - no Session
当我点击findNonDetailedBeanAById控制器方法时,我收到错误:
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)`
需要做哪些改变?
答案 0 :(得分:0)
对于详细的findBy方法,您可以构建自定义查询并在查询中获取beanB,例如getSession().createQuery("SELECT a FROM beanA a LEFT JOIN FETCH a.beanB WHERE a.id == :id")
对于懒惰的findBy方法,我认为你需要在控制器级别添加@Transactional(readonly = true),因为在使用注释为transactional的服务获取beanA之后,你试图使用beanA。我认为它试图从数据库中获取beanB但是hibernate会话可能已经被关闭了。
我无法试用我的任何建议,因为我只是在打电话。