2010-10-15 2 views
0

У меня есть slsb, который держит мою бизнес-логику, как мне использовать generics для изменения следующих трех методов в один общий метод? Первые два - это тот же самый дБ, третий - другая база данных. Кроме того, методы требуют дополнительной аннотации в отношении транзакции?Как реализовать дженерики с использованием 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

Если вам требуется слияние двух объектов из двух разных баз данных в рамках одного и того же метода, вы должны настроить JTA - поскольку транзакция будет охватывать 2 базы данных.

Не слишком уверен в том, что вы пытаетесь сделать с общим делом ... Вы пытаетесь предоставить метод для крап-теста, например. T extends AbstractEntity, а затем в методе сырого,

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

+0

Да, в EJB3 все методы EJB по умолчанию являются транзакционными (НЕОБХОДИМО). Таким образом, @TransactionAttribute не требуется ни в одном из методов EJB, если вам не нужен другой атрибут tx, чем значение по умолчанию для метода (например, REQIURES_NEW) – Dzhu

Смежные вопросы