2010-10-15 143 views
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

不知道如果我完全理解這個問題,但: 既然你有兩個不同的實體管理器那裏,兩個不同的數據庫(假設您沒有同時將兩個數據庫保存爲相同的數據,看起來您並不相同),我認爲在您的界面中使用兩種不同的方法是合理的。 (我會用不同的名稱來避免混淆,我認爲)。

合併前兩個如何使用通用接口或繼承的抽象基類並將參數類型更改爲該常用類型?

0

如果您需要在同一方法中合併來自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

+0

我認爲無狀態註釋不需要ejb3.0中每個方法的事務屬性註釋? – NimChimpsky 2010-10-16 08:56:13

+0

是的,在EJB3中,所有的EJB方法默認都是事務性的(REQUIRED)。因此,任何EJB方法都不需要@TransactionAttribute,除非您需要與方法上的默認值不同的tx屬性(例如REQIURES_NEW) – Dzhu 2010-10-17 01:00:06