如何使用JPA/hibernate EntityManager和EJB3.0实现泛型?
问题描述:
我有一个slsb持有我的业务逻辑,我如何使用泛型将以下三种方法更改为一种通用方法?前两个是相同的数据库,第三个是不同的数据库。此外,这些方法是否需要进一步注释与交易有关?如何使用JPA/hibernate EntityManager和EJB3.0实现泛型?
@PersistenceContext(unitName = "db")
private EntityManager myEntityManager;
@PersistenceContext(unitName = "db2")
private EntityManager myDB2EntityManager;
@TransactionAttribute(TransactionAttribute.Required)
public void crud(MyEntity myEntity) throws MyException {
myEntityManager.merge(myEntity);
}
public void crud(ADifferentEntity aDifferentEntity) throws MyException {
myEntityManager.merge(aDifferentEntity);
}
public void crud(DB2Entity db2Entity) throws MyException {
myDB2EntityManager.merge(db2Entity);
}
非常感谢提前。 干杯!
答
不知道如果我完全理解这个问题,但: 既然你有两个不同的实体管理器那里,两个不同的数据库(假设您没有同时将两个数据库保存为相同的数据,看起来您并不相同),我认为在您的界面中使用两种不同的方法是合理的。 (我会用不同的名称来避免混淆,我认为)。
合并前两个如何使用通用接口或继承的抽象基类并将参数类型更改为该常用类型?
答
如果您需要在同一方法中合并来自2个不同数据库的2个实体,则应该配置JTA - 因为事务将跨越2个数据库。
不太清楚你想用通用的东西来做什么......你是否试图提供一种方法来阻止例如一个T extends AbstractEntity
,然后在crud方法中,
crud(T entity) {
if (entity instanceof DB1Entity) then em1.merge(entity)
else em2.merge(entity)
}
???
或者是你想做水平分区:
Multi-user Datasources - Spring + Hibernate,
http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring
我认为无状态注释不需要ejb3.0中每个方法的事务属性注释? – NimChimpsky 2010-10-16 08:56:13
是的,在EJB3中,所有的EJB方法默认都是事务性的(REQUIRED)。因此,任何EJB方法都不需要@TransactionAttribute,除非您需要与方法上的默认值不同的tx属性(例如REQIURES_NEW) – Dzhu 2010-10-17 01:00:06