无法使用Hibernate持久化实体

时间:2014-09-21 10:33:43

标签: java mysql hibernate

我有一个包含id和2个外键的表。我需要添加新记录。在persist方法之前,一切都按预期进行 - productPart是有效实体。执行persist后 - MySQL表中不会出现新记录。

DAO

@Repository
public class ProductPartDao{
    @Override
        @Transactional
        public void addProductPart (ProductPart productPart) {
        sessionFactory.openSession().persist(productPart); // doesn't work
    }

服务

@Service
public class ProductPartService{
@Autowired
    ProductPartDao productPartDao;
 @Override
    @Transactional
    public void addProductPart(ProductPart productPart) {
        productPartDao.addProductPart(productPart);
    }

我无法使用sessionFactory.getCurrentSession(),因为它会引发错误:HibernateException: Could not obtain transaction-synchronized Session for current thread

原因是什么?怎么解决?

更新

appContext中的

...
 <tx:annotation-driven/>
...
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
          p:sessionFactory-ref="sessionFactory">

          </bean>
...

UPDATE2

输入为2 id,用于检索productpart个对象。然后将此对象设置为ProductPart对象的字段并保持不变。 productpart的所有检索方法都标记为@Transactional。为什么Spring和Hibernate都遇到了麻烦?

UPDATE3:

当代码更改为sessionFactory.getCurrentSession()时,存在异常:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988)
    at ee.t.mysql.model.ProductPartDAOImpl.addProductPart(ProductPartDAOImpl.java:19)

Exception之前的会话对象: enter image description here

当从加载ConfigurableApplicationContext的main调用时,它可以持久存在。带控制器的Spring Web应用程序失败。

解决

通过替换sessionFactory.openStatelessSession().insert(...)来解决。我不知道它的工作原理和原因。非常感谢您的解释!

0 个答案:

没有答案