@Transactional 和 packagesToScan 是否相互关联?

Are @Transactional and packagesToScan are interlinked?

com.service.EmployeeService 有方法 create createEmployee 调用 dao class 下的方法,即 com.dao.EmployeeDao(having EntityManager as dependency)。 现在我想让方法 createEmployee@Transactional 进行事务处理。是否必须申报包裹com.service 在 spring 配置文件中的 packagesToScan 下 ?

我的意思是必须在 packagesToScan 下使用 @Transactional 声明 class 的包才能使其工作吗?

仅供参考,我参考了 how-does-spring-transactional-really-work 以了解 spring 事务如何在内部工作

@Transactional 用于 class 或事务管理方法,而 packagesToScan 被 spring 用于扫描实体上的注释 classes

<property name="packagesToScan">
            <list>
                <value>com.xyz.EntityName</value>
            </list>
        </property>

我在我的 DaoImpl 方法 (CRUD) 上使用了 @Transactional 并在实体上使用了 packagesToScan 以供 spring 选择。

当您将 spring 与休眠一起使用时,这是 spring 的 class 的责任,即 org.springframework.orm.hibernate4.LocalSessionFactoryBean 如 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 而不是 Hibernate 的新 Configuration().configure().buildSessionFactory()

此外,在 Hibernate 中,您使用

告诉 Hibernate 考虑像 hibrnate.cfg.xml 中那样使用注释的实体
<mapping class="com.hiber.hr.Countries"/>
<mapping class="com.hiber.hr.Departments"/>

同样,您需要通过 packagesToScan 属性.

告诉 spring 同样的事情

内部Spring调用Hibernate的addAnnotatedClass方法org.hibernate.cfg.Configurationclass

从 Spring 调用的 Hibernate 方法:-

public Configuration addAnnotatedClass(Class annotatedClass)
   {
     XClass xClass = reflectionManager.toXClass(annotatedClass);
    metadataSourceQueue.add(xClass);
    return this;
   }

Transactional 使 Spring bean 方法具有事务性。

packagesToScan 是 Spring sessionFactory / entityManagerFactory bean 的 属性,告诉它们在哪里可以找到 JPA 实体。

它们是完全正交的。实体不是 Spring beans。事务性 Spring beans 不是必须由 SessionFactory / EntityManagerFactory 找到的实体。