使用hibernate和spring

时间:2017-08-18 12:26:26

标签: spring hibernate jackson

我正在使用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)`

需要做哪些改变?

1 个答案:

答案 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会话可能已经被关闭了。

我无法试用我的任何建议,因为我只是在打电话。