복붙노트

[SPRING] JPA에서 트랜잭션을 롤백하는 방법은 무엇입니까?

SPRING

JPA에서 트랜잭션을 롤백하는 방법은 무엇입니까?

Spring 프레임 워크에서 유지 관리하는 EntityManager 객체가 있으며 @PersistenceContext 주석을 사용하여 원하는 DAO 클래스에 삽입합니다.

@PersistenceContext(unitName="entityManager")
private EntityManager em;

이 DAO 클래스를 사용하여 이와 같은 데이터베이스에 저장합니다.

class MyClass
{
    @Resource(name="myDao")
    private MyDao dao;

    @Resource(name="myAnotherDao")
    private MyAnotherDao anotherDao;

    public void save(String s1,String s2)
    {
        try
        {
             MyEntity m=new MyEntity();
             m.setName(s1);
             // .. and so on ..

             XYZ x=new XYZ();
             x.setDEF(s2);

             anotherDao.save(x);

             m.setXYZ(x);
             // .. some other stuff .. //
             dao.saveEntity(m);
         }
         catch(Exception e)
         {
             // I would like to rollback the transaction
         }
     }
}

이제 두 daos는 @PersistenceContext (unitName = "entityManager")를 통해 주입 된 동일한 EntityManager를 사용합니다. 이제 setXYZ () 후에 예외가 발생하면 저장된 XYZ 엔티티조차 롤백하고 싶습니다. 그러나 EntityManager를 어떻게 얻습니까?

모든 daos가 동일한 객체를 보유하고 있다면 EntityManager 클래스의 getTransaction (). rollback () 메소드를 호출 할 수 있습니까? getTransaction ()이 새 트랜잭션 또는 현재 EntityManager와 연관된 트랜잭션을 리턴합니까?

해결법

  1. ==============================

    1.더보기 : http://en.wikibooks.org/wiki/Java_Persistence/Transactions http://www.developerscrappad.com/547/java/java-ee/ejb3-x-jpa-when-to-use-rollback-and-setrollbackonly/#sthash.jx3XlK5m.dpuf

    더보기 : http://en.wikibooks.org/wiki/Java_Persistence/Transactions http://www.developerscrappad.com/547/java/java-ee/ejb3-x-jpa-when-to-use-rollback-and-setrollbackonly/#sthash.jx3XlK5m.dpuf

  2. ==============================

    2.아래와 같이 @Transactional로 표시된 메소드에서 RuntimeException을 발생 시키면 롤백됩니다.

    아래와 같이 @Transactional로 표시된 메소드에서 RuntimeException을 발생 시키면 롤백됩니다.

    기본적으로 확인 된 예외가 아닌 모든 RuntimeExceptions 롤백 트랜잭션은 다음과 같습니다.

    @Transactional(rollbackFor={MyRuntimeException.class, AnotherRuntimeException.class})
    public SomeVal someTransactionalMethod(){
       ...
    }
    
  3. ==============================

    3.예외를 잡지 마십시오. 거품을 내버려 두십시오. 트랜잭션 메소드 호출에서 런타임 예외가 발생하면 Spring은 자동으로 트랜잭션을 롤백합니다. 그리고 발신자는 모든 것이 잘되었다고 생각하는 대신 나쁜 일이 발생한다는 것을 적어도 알게됩니다.

    예외를 잡지 마십시오. 거품을 내버려 두십시오. 트랜잭션 메소드 호출에서 런타임 예외가 발생하면 Spring은 자동으로 트랜잭션을 롤백합니다. 그리고 발신자는 모든 것이 잘되었다고 생각하는 대신 나쁜 일이 발생한다는 것을 적어도 알게됩니다.

    어쨌든, 대부분의 예외는 플러시 시간에 발생하고 플러시는 주로 커밋 직전에 스프링 트랜잭션 인터셉터에서 발생하기 때문에 catch 블록은 아무것도 포착하지 못할 것입니다. 엔터티를 유지하면 삽입 쿼리가 즉시 실행되지 않습니다. 트랜잭션이 끝나기 전에 인서트를 실행해야한다고 Hibernate에게 알려줍니다.

  4. from https://stackoverflow.com/questions/26200324/how-to-rollback-transaction-in-jpa by cc-by-sa and MIT license