En Spring, un método anotado con @Transactional
obtendrá una nueva transacción si aún no hay una, pero noté que un método transaccional no obtiene ninguna transacción transacción si se llama desde una no transaccional. Aquí está el código.El método @Transactional llamado desde otro método no obtiene una transacción
@Component
public class FooDao {
private EntityManager entityManager;
@PersistenceContext
protected void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Transactional
public Object save(Object bean) {
return this.entityManager.merge(bean);
}
public Object saveWrap(Object bean) {
return save(bean);
}
}
@Component
public class FooService {
private FooDao fooDao;
public void save(Object bean) {
this.fooDao.saveWrap(bean); // doesn't work.
this.fooDao.save(bean); // works
}
}
saveWrap()
es un método regular que llama save()
que es transaccional, pero saveWrap()
no persistirá cualquier cambio.
Estoy usando Spring 3 e Hibernate 3. ¿Qué estoy haciendo mal aquí? Gracias.
No hay ningún problema al anotar el método saveWrap con @Transactional. El comportamiento predeterminado con la propagación de transacciones es OBLIGATORIO, lo que significa que si tuviera que obtener una transacción anidada (es decir, está en una transacción y luego llama a otro método que también es @Transactional) sería simplemente usar la transacción existente y NO crear otra si eso es lo que le teme) –
¿qué hay de usar cglib para proxy? Recuerdo el consejo del proxy cglib cada método, incluso si lo llamas dentro de la misma clase. – hiway