Lai*_*jus 8 java spring transactions transactional spring-transactions
我有一个基于泛型的DAO类,它是我项目中所有其他DAO类的基础,并包含常用功能:
public class Dao<E> {
private SessionFactory factory;
public void setSessionFactory(SessionFactory factory) {
this.factory = factory;
}
public E get(int id) {
// ....
}
public void save(E entity) {
// ...
}
public void delete(E entity) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我使用多个数据源,指向不同的数据库,因此,我有多个会话和事务管理器:
<bean id="factory1" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="source1" />
</bean>
<bean id="manager1" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="factory1" />
</bean>
<bean id="factory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="source2" />
</bean>
<bean id="manager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="factory2" />
</bean>
Run Code Online (Sandbox Code Playgroud)
现在我想创建几个DAO,在不同的数据库上运行:
@Repository
@Transactional("manager1")
public class Dao1 extends Dao<Entity1> {
@Overrides
@Autowired
@Qualifier("factory1")
public void setSessionFactory(SessionFactory factory) {
super.setSessionFactory(factory);
}
}
@Repository
@Transactional("manager2")
public class Dao1 extends Dao<Entity2> {
@Overrides
@Autowired
@Qualifier("factory2")
public void setSessionFactory(SessionFactory factory) {
super.setSessionFactory(factory);
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是,所有公共方法Dao
都没有@Transactional
来自子类,因此不会发生事务管理.我能想到的唯一选择是覆盖父类方法,因此它们在继承的类中定义,因此需要注意@Transactional
:
@Repository
@Transactional("manager1")
public class Dao1 extends Dao<Entity1> {
@Overrides
@Autowired
@Qualifier("factory1")
public void setSessionFactory(SessionFactory factory) {
super.setSessionFactory(factory);
}
@Overrides
public Entity1 get(int id) {
return super.get(id);
}
@Overrides
public void save(Entity1 entity) {
super.save(entity);
}
@Overrides
public void delete(Entity1 entity) {
super.delete(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我需要在每个 DAO类中执行此操作,代码将无处不在......
有没有更好的方法如何在所有类中共享通用功能,并仍然具有声明式事务管理的所有好处?
Avi*_* T. -2
@Transactional
您应该使用基于 AOP 的事务管理,而不是到处添加注释,例如 -
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
Run Code Online (Sandbox Code Playgroud)
在服务层使用事务是一个很好的实践。