我有一个包含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
,用于检索product
和part
个对象。然后将此对象设置为ProductPart
对象的字段并保持不变。 product
和part
的所有检索方法都标记为@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之前的会话对象:
当从加载ConfigurableApplicationContext
的main调用时,它可以持久存在。带控制器的Spring Web应用程序失败。
解决
通过替换sessionFactory.openStatelessSession().insert(...)
来解决。我不知道它的工作原理和原因。非常感谢您的解释!