2013-05-28 2 views
0

우리는 아파치 카라프에 배치 될 모듈을 개발 중이다. 각 모듈은 도메인 JPA 엔티티/DAO, 서비스, 웹 컴포넌트 등으로 시작하는 계층화 된 구조를 가지며, 각 계층은 서로 다른 OSGi 번들로 바뀝니다.Apache Karaf/OSGi에서 Hibernate와의 트랜잭션

JPA 엔티티는 공통 번들에 속하는 일부 추상 수퍼 유형을 확장합니다. 그리고 여기에 문제가 있습니다.

Karaf와 OSGi의 방법을 배울 때 OpenJPA는 "광고"되기 때문에 먼저 시도했습니다. 컴파일 타임 향상은 여러 번들 (jar)에 걸쳐있는 엔티티 계층 구조 (여러 PU 및 추상 수퍼 유형)로 인해 재앙이었고 시간 낭비였습니다. 비록 그것이 효과가 있었다고하더라도, 나는 OpenJPA 강화가 모든 자바와 OpenJPA 버전으로 모든 모듈을 컴파일 할 것을 요구한다. 미래 버전에서는 각 모듈이 다른 속도로 발전 할 것입니다.

그런 다음 우리는 최대 절전 모드를 살펴보고 튜토리얼 몇 개를 사용해 보았습니다. 그러나 모든 영속 단위는 transaction-type = "JTA"이지만 데이터 소스는 JNDI를 통한 JTA 유형이며 DAO CRUD 메소드는 청사진 (DAO save 메소드)으로 표시되어 있습니다 (예 :

).

entityManager.

위해 entityManager 다음에 때

에만 작동 (계정) 유지됩니다. 플러시();

나는 변화를 기대 한 것은 (저장 방법의 끝에서 - 즉, 현재의 트랜잭션 (transaction)의 끝 경계) 트랜잭션의 끝에서 자동으로 플러시 될

우리가 후 지속() 플러시 추가하면

하지만, 런타임 예외가 발생하면 전체 save 메소드에 대한 롤백이 발생하지 않습니다.

이 로그에 오류가없는 및 ​​디버그 수준에서 확인하는 표시

거래를위한 새로운 영속 컨텍스트 [email protected]d을 만든 [의 Xid : globalId = ffffffca2d6dfffff ...
... 때문에 자동으로
건너 뛰기 JTA 동기화 등록 EntityManager를 org.apache.aries.jpa.container.impl.EntityManagerWrapper을 지우기
...
을 확인하는 조인 트랜잭션이 완료되면 @ 42e4823d.

그래서 트랜잭션 존재하지만, 플러시 모드가 자동으로 설정된다 그런데

.. 데이터베이스로 푸시 변경하지 않고 종료한다.

어떤 팁을 주셔서 감사합니다.

+0

당신이 어딘가에 코드 또는 단순화 된 버전을 게시 할 수 있습니다 희망 . 이 정보로 추측하기는 약간 어렵습니다. Hibernate는 현재 OSGi와 친숙하지 않습니다. 따라서 Eclipselink를 사용해 볼 수도 있습니다. 그것은 이제 양자리에서 지원됩니다. –

답변

0

Hibernate 팀이 Hibernate가 OSGi에서보다 원활하게 실행되도록 개선 한 점 때문에 최신 Hibernate 버전 사용을 고려해 볼 수 있습니다.

+0

은 Hibernate 4.2.3에서 릴리즈되었다. [HHH-7527] (https://hibernate.atlassian.net/browse/HHH-7527)을 보라. – sfussenegger

0

쉬운 OSGI 통합을 위해 EclipseLink를 사용하는 것이 좋습니다.

JPG를 OSGI와 함께 사용했습니다. 오픈 JPA에서 시작하여 문제를 푼 후에 Hibernate로 전환하고 EclipseLink를 사용하여 다른 문제를 해결했습니다.

그것이

관련 문제