2011-03-23 1 views
31

난 그냥 내 JPA 2.0 연구를 시작하고, 나는이 코드 조각이 :JPA 2.0의 세션과 트랜잭션의 차이점은 무엇입니까?

em = SessionFactory.startSession(); 
tx = em.getTransaction(); 

내 문제 : 나는 completly 세션의 사용 및 사용의 차이를 이해한다면 잘 모르겠어요를 거래. 몇 줄에서 누구나 그들 사이의 가장 큰 차이점을 말해 줄 수 있습니까? 감사 !

답변

85

귀하는 은행에 가서 2 개의 수표를 입금하고 약간의 금액을 인출하십시오.

그래서 당신은 창구가 열릴 때까지 줄을 서십시오.

첫 입금. 두 번째. 그러면 철수하게됩니다.

이제 끝났습니다. 계좌를 종료합니다.

출납원에게가는 것은 세션을 만드는 것과 같습니다. 이제 은행에있어 일할 준비가되었습니다.

각 입금 및 인출은 자체 소유의 일련의 작업이며, 이는 귀하의 거래입니다.

작업을 끝내고 나가면 세션을 닫거나 버립니다.


본질적으로 세션에는 거래가 포함되어 있으므로 은행에 갈 수 없다면 은행 예금을 할 수 없습니까?

+0

@ 데이비드 감사, 그것은 내가 사람들에게 웹 세션 요청/응답 관계를 설명하는 방법도있다 :

다음은 하이버 네이트 트랜잭션 템플릿입니다. – asawyer

+1

완전성을 위해 단일 거래 내에서 여러 세션을 보유 할 수 있습니까? 식당에서 계산서를 지불해야합니다. 현금이 충분하지 않기 때문에 반값을 지불하고 현금 인출기에 가서 돈을 더 벌고 나머지는 내고 거래가 완료됩니다. 2 회의 세션, 하나의 거래. 이것이 가능한가? – rghome

+0

@asawyer : 그러면 작업을 어떻게 구성할까요? 작업이 트랜잭션과 다른 점은 무엇입니까? –

2

세션은 데이터베이스와 상호 작용할 때 사용하는 세션입니다.

트랜잭션은 세션이 작동하는 경계를 지정하는 데 사용됩니다.

기본적으로 트랜잭션은 한 번에 세션과의 상호 작용 만 허용하여 데이터베이스가 손상되는 것을 방지합니다. (데이터베이스에서 많은 트랜잭션을 읽을 수 있기 때문에 조금 복잡해 지지만 쓰고있는 트랜잭션은 하나뿐입니다.)

9

em = SessionFactory.startSession();

JPA에는 세션이없고 SessionFactory도 없습니다. SessionFactory는 JPA를 사용할 경우 (Hibernate의 자체 API를 사용하거나 JPA 제공자로 Hibernate를 사용하지만 둘 다 사용하지 않는 경우) 사용해서는 안되는 최대 절전 모드 인터페이스입니다.

+0

JPA 제공자로 최대 절전 모드로 전환했습니다. 그래서, 내가 말한 것은 ".. JPA 2.0"대신 ".. in hibernate"라는 제목을 작성 했어야한다는 것입니다. –

2

최대 절전 모드에서는 트랜잭션 관리가 매우 표준적이고 Hibernate에 의해 던져진 예외는 FATAL이라는 것을 기억하라. 트랜잭션을 롤백하고 현재 세션을 즉시 닫아야한다.

Session session = null; 
    Transaction tx = null; 

    try{ 
     session = HibernateUtil.getSessionFactory().openSession(); 
     tx = session.beginTransaction(); 
     tx.setTimeout(5); 

     //doSomething(session); 

     tx.commit(); 


    }catch(RuntimeException e){ 
     try{ 
      tx.rollback(); 
     }catch(RuntimeException rbe){ 
      log.error("Couldn’t roll back transaction", rbe); 
     } 
     throw e; 
    }finally{ 
     if(session!=null){ 
      session.close(); 
     } 
    }