我有一个基于泛型的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) {
// ...
}
}
在我的项目中,我使用了多个数据源,指向不同的数据库,因此我有多个会话和事务管理器:
<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>
现在我想创建几个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);
}
}
但问题在于,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);
}
}
但是我需要在每个DAO类中这样做,而且代码也会到处相同...是否有更好的方法可以在所有类之间共享通用功能,并仍然拥有声明式事务管理的所有优点?
Dao
的方法,它们仍然需要我指定要使用哪个事务管理器,而在那个地方并不清楚,因为没有默认的事务管理器... 事务管理器是继承类特定的,只有这样才能清楚地知道哪一个DAO需要哪一个事务管理器... - Laimoncijus