여러 엔티티 관리자를 처리하는 방법, 즉 다수의 지속성 단위 복합 지속성 유닛 (CPU에)를 사용하는 것이다. 이러한 복합 지속 단위는 데이터 계층 인 EE 웹 응용 프로그램의 단일 지점에서 평가할 수 있습니다. @PersistenceContext
을 사용하려면 @Stateless
EE Bean이되어야합니다.
다양한 Java 응용 프로그램에서 재사용 가능한 엔티티 클래스를 만들 수있는 복합 지속성 단위가 도입되었습니다. CPU는 엔터프라이즈 아키텍처의 기능입니다. 쇼케이스로 EclipseLink를 사용하기로 결정했습니다. 실행중인 프로덕션 애플리케이션에서 긍정적 인 경험을했기 때문입니다.
는, 엔티티는 서버 풍경에서 더 많은 웹 서비스 전반에 걸쳐 필요한 일반적인 데이터가 포함되어 있습니다. 예를 들어 일반적인 '이름 주소'엔티티, '사용자 비밀번호 역할'엔티티, '문서 키워드 색인'엔티티 등을 예로들 수 있습니다. 복합 영속 단위 구현은 각 엔티티 정의의 소스가 단 한 곳 ('정의의 단일 지점'). 이 엔티티 정의는 이후이 엔티티 액세스가 필요한 각 Java 웹 응용 프로그램에 포함될 수 있습니다. 복합 퍼시스턴스 유닛의 작용은 다음 가이드에 의해 도시된다
개념은 제 부재 유닛 지속성 정의하여 작동한다. 각 구성원 지속성 단위는 다른 데이터베이스와 연관 될 수 있지만 구성원 지속성 단위는 모두 동일한 실제 데이터베이스를 참조 할 수도 있습니다. EclipseLink (버전 2.6.4)가 하나의 Postgress 데이터베이스와 함께 사용 된 후자에 대한 경험이 있습니다.
필요한 모듈 방식을 사용하려면 Maven이 필요합니다. 다음
설정은이 persistence.xml
된 복합 지속성 부 부재 정의된다 : 전용 메이븐 모듈 관련 기관 하나씩 (자바 @Entity
클래스)의 프로그램 군. 이 Maven 모듈에 복합 영속 단위 멤버 (중요!)도 정의하십시오. 복합 단위 구성원 PuPersonData은 개인 데이터를 특징 짓는 관련 엔티티 집합을 나타냅니다. 멤버 영속성 단위 PuPersonData를 (
<persistence-unit name="PuPersonData" transaction-type="JTA">
...
<jta-data-source>jdbc/PostgresDs</jta-data-source>
...
)으로 정의하십시오. 제 메이븐 모듈
은 다른 복합 지속성 부 부재 PuWebTraffic ( <persistence-unit name="PuWebTraffic" transaction-type="JTA">
...
<jta-data-source>jdbc/PostgresDs</jta-data-source>
...
)를 정의한다.웹 트랜잭션, 로그온, 세션 등에 관한 데이터를 저장하는 다른 엔티티 (@Entity
으로 표시된 Java 클래스)를 포함하십시오. 두 복합 엔티티 단위 구성원은 엔티티에 대해 분리되어 있어야하며 엔티티에서 겹침이 허용되지 않아야합니다 - 이름.
이 <properties>
<property name="eclipselink.composite-unit.member" value="true"/>
...
</properties>
복합 지속성
우리는 지금 세 번째 메이븐에서 정의하는 단위가 모두 포함하는 복합 지속성 단위 CPuPersonSessionData를 모듈 :
두 퍼시스턴스 유닛 회원들은 XML-정의에 속성이 퍼시스턴스 유닛 멤버 PuPersonData 및 PuWebTraffic.
<persistence-unit name="CPuPersonSessionData" transaction-type="JTA">
지속성이 합성 부 CPuPersonSessionData 두 속하는 메이븐 모듈의 편집 결과 인 병 등의 수단에 의해 두 지속성 유닛 멤버와 PuPersonData PuWebTraffic을 말한다. 복합 지속성 유닛의 XML-정의에서
...
<jar-file>PuPersonData.jar</jar-file>
<jar-file>PuWebTraffic.jar</jar-file>
...
다음 속성을 설정해야 <properties>
<property name="eclipselink.composite-unit" value="true"/>
...
</properties>
이 설정 복합 지속성 유닛 지속성 부보다 자바 EE 다르게 처리되는 것을 보장 회원. 저장하고 개인 데이터와 트래픽 데이터를 모두 개체를 검색하는 것입니다 자바 웹 응용 프로그램에서
자바에서 퍼시스턴스 유닛의
이 사용은 단지 복합 퍼시스턴스 유닛이 포함되어
@Stateless
public class DataLayer {
@PersistenceUnit(unitName="CPuPersonSessionData")
EntityManager em;
...
이제 persist
, find
및 merge
과 같은 일반 'em'연산을 복합 엔티티 구성원 중 하나에 포함 된 각 엔티티에서 수행 할 수 있습니다.
Payara에서는이 복합 영속 단위가 각 영속 단위 구성원과 관련된 엔티티를 처리하는 데 XA 트랜잭션이 필요하지 않았습니다.
메이븐
메이븐 부모 POM 파일은 관련 모듈에 대한 사양을 포함 할 필요가있다.
...
<modules>
<module>PersonData</module>
<module>WebTraffic</module>
<module>PersonSessionData</module>
</modules>
...
각 모듈의 POM 파일은 부모 POM 파일을 참조하여 일반적인 Maven 프로젝트로 구성되어야합니다.
함정 :
- 당신은 다소 까다로운 일이 될 수있는, 제대로 메이븐 멀티 모듈 프로젝트를 구성해야합니다. 각 복합 지속성 유닛 멤버는 별도의 Maven 모듈을 구성합니다. 또한 복합 영속 단위는 별도의 Maven 모듈입니다. 회원은 먼저 Maven 순서로 컴파일해야합니다.
- 복합 지속 유닛의 모듈을 컴파일 할 때 복합 지속 유닛의 '병'을 찾아야합니다.
- 각 복합 영속 단위 구성원의 엔티티는 생성 된 'jar'에서 직접 'classes'디렉토리에서 사용할 수 있어야합니다 (Maven을 통해 엔티티에 대한 추가 경로를 추가하는 것은 가능하지만 복잡합니다).
- 복합 영속 단위가 '영속 단위'의 'jars'를 사용할 수 있어야 복합 영속 단위가이를 찾을 수 있습니다.
이득은 재사용 가능한 엔티티와 함께 작동하는 깔끔한 엔터프라이즈 데이터 레이어로, 각각 하나의 중심 정의가 있습니다. 또한 교차 단위 원시 SQL 쿼리를 수행 할 수도 있습니다. 나는이 일을 또한 얻었다.
복합 지속성 단위 구성원이 다른 실제 데이터베이스에서 실행될 때 교차 단위 기본 쿼리가 작동하지 않는다고 명시된 문서에는 이것은 여전히 검증되어야합니다.
감사합니다. 좋습니다, 그래서 컨테이너 트랜잭션을 기반으로하기 때문에'EntityManagerFactory'의 싱글 톤과 인젝션을 잊어 버려야합니다. 내가 잘 이해하면 각 콩에있는 모든 EM을 복사하라고 충고하겠습니까? 유지 보수 문제를 피하고 싶습니다. 그것이 사실이 아니라면 더 나은 설명 주셔서 감사합니다. –
예, 컨테이너 관리 트랜잭션을 사용하려는 경우 이는 유일한 방법입니다. 그것은 싱글 톤에서 엔티티 관리자를 선언하는 것과 정말로 다르지 않습니다. 모든 엔티티 관리자와 함께 싱글 톤이 아닌 고유 한 엔터프라이즈 빈을 개발하여 어댑터 설계 패턴을 적용 할 수 있습니다 (관리자를 추가하거나 제거 할 때 단일 지점을 수정할 수 있습니다). 이 bean은 모든 엔 터프 라이즈와 메소드 호출을 다른 엔터프라이즈 빈에 라우트하여 적절한 엔티티 관리자를 전달합니다. 불행히도 단점은 후자의 엔터프라이즈 bean 메소드가 관리자를 매개 변수로 포함해야한다는 것입니다. – remigio
다른 콩은 모든 EM이 저장되는 고유 한 콩을 확장 할 것입니다. EM이 하드 코딩 된 고유 한 장소를 갖고 싶습니다. 영어는 제 언어가 아니며 때로는 기술 용어를 이해하는 데 문제가 있습니다. 용서하십시오. –