2010-07-26 21 views
12
  1. Tenemos el administrador genérico básico que es heredado por todos los administradores. El administrador de Base está anotado con @ Anotaciones Transactional.Administradores de transacciones múltiples con anotación @Transactional

  2. Hay 2 grupos de transaccionales servicios:

    • x.y.service1.* - han de ser gestionados por transactionManager1
    • x.y.service2.* - tienen que ser gestionados por transactionManager2

Cómo las transacciones pueden ser configuradas sin nessesity para anular TODOS los métodos transaccionales y especificar el administrador de transacciones?

@Transactional(readOnly = true) 
public abstract class GenericManagerImpl<D extends IGenericDao, T extends BaseObject, PK extends Serializable> 
     implements IGenericManager<T, PK> { 

    protected D dao; 

    @Autowired 
    public void setDao(D dao) { 
     this.dao = dao; 
    } 


    @Transactional(readOnly = false) 
    public void save(T object) { 
     dao.save(object); 
    } 

    @Transactional(readOnly = false) 
    public void remove(T object) { 
     dao.remove(object); 
    } 


} 

@Service 
class UserManagerImpl 
     extends GenericManagerImpl<IUserDao, User, Long> 
     implements IUserManager { 

// Everything is OK. User is managed by txManager1 

} 

@Service 
class BillingManagerImpl 
     extends GenericManagerImpl<IBillingDao, Billing, Long> 
     implements IBillingManager { 

    @Override 
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager 
    public void save(final Billing billing) { 
     super.save(billing); 
    } 

    @Override 
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager 
    public void remove(final Billing billing) { 
     super.remove(billing); 
    } 
} 

Lo más probable es que necesito para combinar con la anotación AOP @Transactional.
En realidad, lo que quiero es:
1) Para poder configurar transacciones (indicador de solo lectura, propagación, aislamiento, etc.) con la anotación @Transactional.
2) definir la estrategia para elegir administrador de transacciones fuera de mis clases (AOP utilizando, por ejemplo)
xyservice1. * -> usar txManager1
xyservice2. * -> usar txManager2

¿Es posible ?

Respuesta

1

Creo que se puede definir en @Transactional clase de nivel

@Service 
@Transactional(readOnly = false, value="txManager2") 
class BillingManagerImpl .... 
+0

He leído solo y no tengo métodos de solo lectura en el administrador de bases. tengo 2 opciones aquí: 1) tener un nivel de clase de anotación @Transactional (readOnly = true) y el nivel de método de anotación @Transactional (readOnly = false) por cada NO leer sólo los métodos 2) tienen nivel de clase de anotación @Transactional (readOnly = false) y la anotación de nivel de método @Transactional (readOnly = true) para cada método de solo lectura En cualquier caso, tendré que anular las anotaciones transaccionales a nivel de método para los servicios que deben ser gestionados por txManager2 – Seyran

10

Existe la posibilidad de create your own annotations como atajos para @Transactional(value="tx1"). (Estos pueden ser usados ​​en clase o nivel de método)

de la documentación de referencia:

Por ejemplo, la definición de los siguientes anotaciones

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("order") 
public @interface OrderTx { 
} 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("account") 
public @interface AccountTx { 
} 

nos permite escribir el ejemplo de la sección anterior como

public class TransactionalService { 

    @OrderTx 
    public void setSomething(String name) { ... } 

    @AccountTx 
    public void doSomething() { ... } 
    } 
+0

+1, buena idea. – Bozho

+0

no mío, desafortunadamente. Solo lo busqué :-) –

+0

Sí, sé que puedo usar metaanotaciones. Pero esto es solo una simplificación de la configuración. Todavía voy a tener que anular el método y anotarlo con una anotación como @OrderTx – Seyran

Cuestiones relacionadas