2011-01-28 2 views
2

글래스 피쉬 3, JPA 및 Java EE 6에서 작업 해 왔습니다. 웹 컨테이너에서 Entity Manager를 EJB에 삽입하고 트랜잭션을 처리하도록 할 수 있습니다. 롤백 등 데스크톱 응용 프로그램에서 무엇을해야합니까? 분명히 그것은 작동하지 않습니다. 나는 아직도 ORM을 위해 JPA를 사용할 것이라는 것을 안다. 하지만 EntityMangerFactory를 만든 다음 EntityManager를 만듭니다. 수동으로 거래를 처리해야합니까? 몇 가지 샘플 애플리케이션을 볼 수 있다면 좋을 것입니다. 감사!Java 데스크톱 애플리케이션에서 데이터베이스 액세스를 수행하는 가장 좋은 방법

답변

3
EntityManagerFactory entityManagerFactory = 
    Persistence.createEntityManagerFactory("DS"); 
em = entityManagerFactory.createEntityManager(); 

당신은 스프링 프레임 워크 또는 다른 뭔가를 사용하지 않는 경우, em.getTransaction.begin()em.getTransaction.commit()를 호출하여 트랜잭션을 처리해야합니다.

2

글쎄, Spring + JPA를 사용 해보길 바란다. 컨테이너가 필요 없다. 애플리케이션 컨텍스트 일 ​​뿐이므로 트랜잭션을 구성 할 수있다. 당신은 트랜잭션을 돌보지 않고, 당신이 원하는 트랜잭션에 주석을 달아줍니다.

+1

+1 : 44 초 이상 빠릅니다. – Ralph

2

당신은 Spring을 사용할 수 있습니다. JEE6에서 데스크탑 애플리케이션에 이르기까지 당신이 알고있는 유물을 가져올 것입니다. (물론 100 %가 동일하지 않습니다!)

1

또 다른 옵션은 Embeddable EJB Container이라고 할 수 있습니다. 그것은 당신에게 당신이에 익숙 할지도 모른다 주입, CMT etc.와 동일한 서비스를 제공 할 수 있었다.

1

나는 Hibernate와 Swing을 사용하여 2 계층 Java Swing 클라이언트를 만들었으므로 다시는하지 않을 것이다. 오늘 다시 작성해야한다면 원시 JDBC 쿼리를 사용하거나 iBatis와 같은 매우 얇은 ORM 매핑 프레임 워크를 사용할 것입니다.

Hibernate (그리고 내 경험이 Hibernate에만 있지만 다른 JPA 구현을 가정 함)는 데스크탑 환경에서 매우 다르다. 이유는 객체가 데스크탑에서 훨씬 더 긴 수명을 갖는 경향이 있고 2) 객체가 언제 액세스 될지를 아는 것은 매우 어렵 기 때문에, 느린 로딩을위한 올바른 트랜잭션 처리는 문제가 있습니다.

웹 요청 - 응답 패러다임은 근본적으로 트랜잭션 방식이므로 트랜잭션을 구분하는 것이 매우 쉽습니다. 데스크톱에서는 모든 키 누르기, 심지어 MouseMovedEvent만이 잠재적으로 데이터베이스 쿼리 또는 지연로드를 트리거 할 수 있으므로 트랜잭션을 시작하고 커밋 할시기를 훨씬 더 어렵게 만듭니다.

오류 처리 및 개체 새로 고침은 개체를 훨씬 오래 사용하는 경향이 있으므로 (종종 응용 프로그램 실행 기간 동안) 큰 문제입니다. Hibernate에서 예외는 복구 할 수 없다. 즉, DB에서 모든 것을 다시로드해야한다. 웹에서는 문제가 없지만 GUI 전체에서 다양한 모델에 수천 개의 개체가 포함되어있는 경우에는 문제가되지 않습니다.