2010-03-16 2 views
2

내 "HelloJPA"코드 (아래)는 직원을 데이터 저장소에 저장하려고합니다. 그러나, (지역 자원) 트랜잭션을 커밋 이후 지속 된 개체를 읽을 수있는 시도가 "IllegalStateException이"로 보상 : 것 같아요,초급 질문 : JPA의 기본 삽입 관용구?

Employee employee = ... 
EntityManagerFactory factory = 
    Persistence.createEntityManagerFactory("HelloJPA", System.getProperties()); 
EntityManager manager = factory.createEntityManager(); 
EntityTransaction transaction = manager.getTransaction(); 
try { 
    transaction.begin(); 
    manager.persist(employee); 
    transaction.commit(); 
} finally { 
    if (transaction.isActive()) { 
     transaction.rollback(); 
    } 
    manager.close(); 
} 
System.out.println("Employee id == " + employee.getId()); //<< IllegalStateException 

OK, 관리자 나의 새로운 할당 직원 객체와 그것의 소유했다 트랜잭션을 커밋하면 사용할 수 없게되었습니다. 그렇다면이 간단한 작업을 구현하는 일반적인 관용구는 무엇입니까? 즉, 개체를 읽기 전용 액세스로 유지하면서 데이터 저장소에 모든 방법으로 쓰는 것은 무엇입니까? 설명서 (자습서 또는 API 참조)에서는이 문제를 구체적으로 다루지 않으며 자원 로컬 트랜잭션을 사용하는 것으로 발견 된 코드 샘플은 커밋 후 객체를 읽지 않으려 고하는 것처럼 보입니다 ...하지만 분명히 간단한 방법이 있어야합니다. 그것을 할 수 ??

미리 도움을 주셔서 감사합니다/이것에 포인터!

+0

먼저 생성 된 직원이 실제로 DB에 유지됩니까? 두 번째로, 당신의 종업원 실체는 어떻게 생겼습니까? 로컬 트란이 커밋 한 후에 엔티티를 사용하는 것은 유효한 일입니다. – Rick

+0

안녕하세요, Rick, thx 님의 의견입니다. 직원이 데이터 저장소에 추가됩니다. 물론 이것은 장난감 예, 그래서 "직원은"말기 단순한 같습니다 @Entity 공용 클래스 직원이 구현 직렬화 { 개인 정적 최종 오래 serialVersionUID의 = ...; @Id 전용 문자열 ID; @Basic 개인 문자열 이름; @Basic 전용 문자열 위치; // getters 및 setters가 생략되었습니다. } 그게 도움이됩니까? 미리 감사드립니다! – jucar

+0

IllegalStateException을 게시 할 수 있습니까? 릭 말이 맞아. – Mike

답변

0

employee은 엔티티 관리자를 닫은 후에 분리되지만 분리 된 엔터티의 annotated 속성에 액세스하는 것을 금지하는 것은 없습니다. IOW, 코드가 정확하고 Hibernate와 EclipseLink에서 작동합니다. OpenJPA의 Jira에서 기존 문제점을 검색하거나 새로운 문제점을 열 수 있습니다.