java - @Transactional 问题以及如何与@Service 一起使用

标签 java spring hibernate service transactions

我的服务使用了一个通用的 DAO(它明确地使用了 Hibernate session 工厂)。我花了一些时间才发现这个错误

org.hibernate.HibernateException:没有 Hibernate Session 绑定(bind)到线程,并且配置不允许在此处创建非事务 session

我对我的服务进行了注释并且一切正常。现在我想使用上下文路径扫描,并从我的配置中删除这一行:

<bean id="societaService" class="it.trew.prove.services.SocietaService" />

所以....这是我的最终版本:

@Service
@Transactional(readOnly = true)
public class SocietaService {

    private Dao societaDao;

    @Autowired
    public void setSocietaDao(Dao societaDao) {
        this.societaDao = societaDao;
    }

    public void salvaSocieta(Societa s) {
        societaDao.save(s);
    }

    public List<Societa> listAll() {
        return societaDao.getAll(Societa.class);
    }

    public void deleteById(Long id) {
        societaDao.delete(getSocieta(id));
    }

    public Societa getSocieta(String id) {
        return getSocieta(Long.parseLong(id));
    }

    public Societa getSocieta(Long id) {
        return societaDao.get(Societa.class, id);
    }
}

添加@Service 注释会使我的应用程序出现上述可怕的 hibernate 错误。为什么? 删除 @Service 并通过 xml 配置服务 bean = 它有效。为什么??

另外:

  • 事务性注释我的服务类是否使其所有方法都在事务中执行?

编辑

这是我的上下文 xml:

<context:annotation-config />   
<context:component-scan base-package="it.trew.prove" /> 

<!--  Hibernate -->

<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.google.appengine.api.rdbms.AppEngineDriver" />
<property name="url" value="jdbc:google:rdbms://xxx:xxx/xxx" />
</bean>


<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            <value>it.trew.prove.model.beans.Scadenza</value>
            <value>it.trew.prove.model.beans.Fornitore</value>
            <value>it.trew.prove.model.beans.Societa</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <!-- <prop key="hibernate.hbm2ddl.import_files">/setup.sql</prop> -->
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean> 

最佳答案

您是否启用了注释?

<context:annotation-config />

<context:component-scan base-package="org.example"/>

这将启用@Service、@Component 和@Repository 等注解

关于java - @Transactional 问题以及如何与@Service 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9733769/

相关文章:

java - 找出导致 java.security.AccessControlException 的原因

java - BeanFactoryPostProcessor修改实际的bean定义而不是实例?

java - 使用 JDBC 对 MySQL 进行低优先级更新——如何检查它们是否有效

mysql - Hibernate:如何通过 jpa.hibernate.ddl-auto 选项创建和执行 sql 过程

java - 为名称数组创建快速排序

java - 无法从 xml 文件膨胀relativelayout

java - 如何坚持涉及@JoinFormula 的逆@OneToOne 映射?

java - JPA/Hibernate - 与 child 一起分离实体

java - 是否可以选择在不禁用 CardLayout 的情况下添加 ScrollPane?

java - 如何防止页面刷新? AJAX、Spring MVC