gpt4 book ai didi

java - 组织.hibernate.HibernateException : save is not valid without active transaction in my case

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:35 25 4
gpt4 key购买 nike

我有 GenericService 类,它封装了子类的 crud 方法:

public abstract class GenericService<D extends GenericDao<T, I>, T extends DomainObject<I>, I> {

public I save(T t) {
return getDao().save(t);
}
...........................
}

AnswerService 扩展 GenericService。它 Autowiring AnswerDao 并将自己声明为 @Service@Transactional spring 组件。

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class AnswerService extends GenericService<AnswerDao, Answer, Long> {

@Autowired
private AnswerDao answerDao;

@Override
public void setDao(AnswerDao d) {
this.answerDao = d;
}

@Override
public AnswerDao getDao() {
return answerDao;
}
................................
}

AnswerDao 扩展 GenericDao 实现方法 save

public abstract class GenericDaoHibernate<T extends DomainObject<I>, I extends Serializable> implements GenericDao<T, I> {

private Class<? extends T> entityClass;
private SessionFactory sessionFactory;

public GenericDaoHibernate(Class<? extends T> entityClass) {
this.entityClass = entityClass;
}

public GenericDaoHibernate() {
}

@Autowired
private void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
Assertor.assertNotNull(sessionFactory);
}

public Session currentSession() {
return getSessionFactory().getCurrentSession();
}

@SuppressWarnings("unchecked")
@Override
public I save(T entity) {
// Transaction transaction = currentSession().beginTransaction();
I id = (I) currentSession().save(entity);
// transaction.commit();
return id;
}

当我在 GenericService 上调用 save 方法时,我希望 spring 为 hibernate Session 创建事务,但是事务没有创建,我在 GenericDaoHibernate 中得到了这个错误.save 方法:

org.hibernate.HibernateException: save is not valid without active transaction

我的服务层 spring 配置文件是:

<!-- Hibernate 4 SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource" p:packagesToScan="com.javahelp.domain.impl">
<property name="configLocations">
<array>
<value>classpath:META-INF/hibernate/hibernate.cfg.xml</value>
</array>
</property>
</bean>
<!-- A transaction manager for working with Hibernate session methods.
Without this transaction manager none method of hibernate session works -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- enable scanning for @Transactional annotation -->
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- autodetect all spring @Service beans in package com.javahelp.service
(service layer) -->
<context:component-scan base-package="com.javahelp.service" />

因此,当我不依赖 spring @Transactional 支持并通过 org.hibernate.Session 开始/提交事务时,一切正常,我没有错误。

为什么 spring 不为在 GenericSerice 上调用的方法提供事务处理?

顺便说一句,GenericService 和 AnswerService 没有接口(interface)。

编辑。这是 HibernateTransactionManager.doGetTransaction 方法返回的事务:

txObject    HibernateTransactionManager$HibernateTransactionObject  (id=190)    
connectionHolder null
newSession false
newSessionHolder false
previousIsolationLevel null
savepointAllowed false
sessionHolder null

我还更改了我的服务以使用接口(interface),但没有帮助。

最佳答案

不知道根本原因,但从我的 hibernate 配置中删除以下属性解决了我的问题。

<prop key="hibernate.current_session_context_class">thread</prop>

在此 forum 上找到

关于java - 组织.hibernate.HibernateException : save is not valid without active transaction in my case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com