2011-06-23 23 views
5

¿Puede llamar a un método que requiere una transacción dentro de un método que no lo hace?Usando @TransactionAttribute (value = TransactionAttributeType.NEVER) en un método

@TransactionAttribute(value = TransactionAttributeType.NEVER) 
public void DoSomething(final List<Item> items) { 

//can you call a method that requires a transaction here ? 
for (Item i : items) { 
    methodCall(item); 

} 

@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
public void methodCall(final Item item) { 
    // access lazily loaded item properties 
    item.getSalesOrder(); 
    item.getAllocation(); 

    //throws org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

} 

El atributo .Nunca dice que garantizará el método no se ejecuta dentro de una transacción, pero ¿qué pasa con las llamadas a otros métodos dentro de ese método

+0

Puede aplicar la anotación @TransactionAttribute en el nivel de clase para especificar el atributo de transacción predeterminado para todos los métodos de negocio del enterprise bean. Puede aplicar esta anotación en el nivel de método para especificar el atributo de transacción para ese método. La aplicación de la anotación en el nivel de método anula la anotación de nivel de clase (si corresponde) para ese método. – Luke

Respuesta

9

La anotación sólo define el estado de la transacción necesaria que debe existir cuando el se invoca el método anotado (en este caso, una transacción no debe existir). No restringe lo que puede ocurrir dentro de la ejecución del método de anotación. Entonces, dentro de este método, podría comenzar una nueva transacción sin ningún problema.

En el ejemplo que proporcionó, puede llamar a un método que requiere una transacción desde un método que tiene una configuración transaccional de NUNCA. En esta situación, se creará una nueva transacción para la llamada a método que requiere la transacción. Si el método interno está marcado con una configuración OBLIGATORIA, la llamada al método interno fallará ya que no existe una transacción existente y la configuración OBLIGATORIA no crea automáticamente una para usted.

+0

Gracias por aclarar eso. No pude ver ninguna razón por la que no funcionaría. Sin embargo, no puedo acceder a las propiedades cargadas de forma lenta dentro de la invocación del método interno (aunque está anotado con require new) – Luke

+0

¿Cómo obtuvo acceso el bean de nivel superior al bean interno ('itemBean? ')? ¿El contenedor 'itemBean' también se administra o lo instancia directamente (las anotaciones de transacción solo se admiten en beans gestionados)? Además, ¿cuáles son las propiedades cargadas perezosas a las que se refiere y cómo están asociadas con la transacción (si es que las hay)? –

+0

Cada artículo tiene un pedido de venta y una asignación que se cargan de forma diferida, así como otras propiedades que no están relacionadas con esta transacción en particular. En este caso, ambos métodos están en el mismo bean, por lo que mi ejemplo de código no debería haber tenido el prefijo itemBean. – Luke

Cuestiones relacionadas