Vorweg wir benutzen JPA mit EJB 3.0 .
Folgende Sachlage:
Wir haben eine Controller-, eine Service- und eine DAOschicht und bisher brauchten wir immer nur 1 Statement - beispielsweise eine Person speichern wird vom "Personencontroller" angestossen, der ruft das Service auf welches wiederum dem DAO sagt "speichere mir das" = 1 Transaktion.
Nun ist es aber so dass bspw. eine Person ein Auto besitzt und selbiges wird nun verkauft und bekommt eine neue Person als Besitzer. Hierfür haben wir wieder einen Controller welcher dann aber , zur Zeit, 2 Services aufrufen muss. Zum einen muss er den alten Personensatz updaten (ein gueltigbis Timestamp setzen) und 2. muss ein anderes Service aufgerufen werden um der neuen Person das Auto umzuhängen.
Beides sollte aber in einer Transaktion laufen und so wie es jetzt ist sind es aber 2 Transaktionen. Sprich eigentlich sollten wir beide Dinge in einem Service abhandeln und hierbei ist das Problem dass wir nicht wissen wie wir hier 1 Transaktion durchführen können. Mit Spring hat das prima mit @Transactional funktioniert, dies bietet EJB aber nicht an.
Hat jemand einen Lösungsvorschlag?
hier die abstrakte dao klasse, selbige wird dann bspw. von Person (PersonDAO) und Auto(AutoDAO) implementiert.
Folgende Sachlage:
Wir haben eine Controller-, eine Service- und eine DAOschicht und bisher brauchten wir immer nur 1 Statement - beispielsweise eine Person speichern wird vom "Personencontroller" angestossen, der ruft das Service auf welches wiederum dem DAO sagt "speichere mir das" = 1 Transaktion.
Nun ist es aber so dass bspw. eine Person ein Auto besitzt und selbiges wird nun verkauft und bekommt eine neue Person als Besitzer. Hierfür haben wir wieder einen Controller welcher dann aber , zur Zeit, 2 Services aufrufen muss. Zum einen muss er den alten Personensatz updaten (ein gueltigbis Timestamp setzen) und 2. muss ein anderes Service aufgerufen werden um der neuen Person das Auto umzuhängen.
Beides sollte aber in einer Transaktion laufen und so wie es jetzt ist sind es aber 2 Transaktionen. Sprich eigentlich sollten wir beide Dinge in einem Service abhandeln und hierbei ist das Problem dass wir nicht wissen wie wir hier 1 Transaktion durchführen können. Mit Spring hat das prima mit @Transactional funktioniert, dies bietet EJB aber nicht an.
Hat jemand einen Lösungsvorschlag?
hier die abstrakte dao klasse, selbige wird dann bspw. von Person (PersonDAO) und Auto(AutoDAO) implementiert.
Java:
public abstract class CRUDEntityFacade<T extends XObjekt> implements
IGenericEntityFacade<T> {
private static Logger logger;
protected transient final Class<T> entityClass;
@PersistenceContext(unitName = "xxx")
private EntityManager em;
@SuppressWarnings("unchecked")
public CRUDEntityFacade() {
entityClass = (Class) ((java.lang.reflect.ParameterizedType) this
.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
logger = Logger.getLogger(this.getClass());
}
@Override
public T create(T entity) throws EntityExistsException,
IllegalStateException, IllegalArgumentException,
TransactionRequiredException {
if (logger.isTraceEnabled()) {
logger.trace("CRUDEntityFacade.create("
+ entityClass.getSimpleName() + ")");
}
em.persist(entity);
return entity;
}
@Override
public T update(T entity) throws IllegalStateException,
IllegalArgumentException, TransactionRequiredException {
if (logger.isTraceEnabled()) {
logger.trace("CRUDEntityFacade.update("
+ entityClass.getSimpleName() + ")");
}
em.merge(entity);
if (logger.isDebugEnabled()) {
logger
.debug("CRUDEntityFacade.update(Serializable) updated 1 entity: "
+ entity.toString());
}
return entity;
}