@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 找到的实体。
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 找到的实体。