2012-09-20 3 views
1

EclipseLink을 내 JPA 구현으로 사용하고 있습니다. 우리 프로젝트에는 config 파일을 모두 저장하는 디렉토리가 있는데, persistence.xml 파일을 config 디렉토리에 저장하고 싶지만 createEntityManagerFactory에서 persistence-unit을 찾을 수있는 방법을 찾을 수 없습니다.다른 구성 파일과 함께 persistence.xml을 저장하는 방법

+0

아주 이상한 요구 사항입니다. 왜 그것을 필요로합니까? – axtavt

+0

경영진은 모든 구성을 같은 장소에두고 싶어합니다. 나는 그것의 유용성을 볼 수있다. 구성 파일이 jar/war 파일에 존재하는 것은 실제로 의미가 없습니다. – BostonJohn

답변

1

persistence.xml은 항상 클래스 경로의 META-INF 디렉토리 내에 있어야합니다. 다른 유형의 Java 응용 프로그램에 대해 META-INF가 제공되어야하는 위치에 대한 자세한 내용은 here을 참조하십시오.

지속성 단위는 persistence.xml 구성 파일에 의해 정의됩니다. META-INF 디렉토리에 persistence.xml이 들어있는 JAR 파일 또는 디렉토리를 지속성 단위의 루트라고합니다. 퍼시스턴스 유닛의 범위는 퍼시스턴스 유닛의 루트에 의해 결정됩니다.

각 지속성 단위는 지속성 범위의 고유 한 이름으로 식별되어야합니다.

영구 장치는 WAR 또는 EJB JAR 파일의 일부로 패키지화되거나 WAR 또는 EAR 파일에 포함될 수있는 JAR 파일로 패키지화 될 수 있습니다.

영속 단위를 EJB JAR 파일의 클래스 세트로 패키지하면 persistence.xml을 EJB JAR의 META-INF 디렉토리에 넣어야합니다.

지속성 단위를 WAR 파일의 클래스 세트로 패키징하는 경우 persistence.xml은 WAR 파일의 WEB-INF/classes/META-INF 디렉토리에 있어야합니다.

+0

이 클래스 경로는 패키지로드와 동일합니까? META-INF 디렉토리를 우리의 libs가 살고있는 디렉토리에 넣으려고했지만 작동하지 않았습니다. 내가 다른 것을 엉망으로 만들지 않으면 그 일을해야합니까? – BostonJohn

+0

jar 압축을 풀면 ('jar xvf myapp.jar'를 사용하여) META-INF가 최상위 디렉토리에있는 한 작동합니다. – Vikdor

+0

하지만 META-INF는 그 다음 병 안에 있어야합니까? (죄송합니다. 필자의 이전 질문이 잘못되었습니다. 외부 라이브러리를로드하는 디렉토리에 넣으려고했습니다.) – BostonJohn

2

spring-orm LocalContainerEntityManagerFactory를 사용하여이 작업을 수행 할 수 있습니다 (원하지 않는 경우 모든 스프링 컨텍스트를 사용할 필요가 없음).

LocalContainerEntityManagerFactory lcemf = new LocalContainerEntityManagerFactory(); 
lcemf.setPersistenceUnitName("some_pu"); 
lcemf.setpersistenceXmlLocation("file:/data/config.xml"); 
EntityManagerFactory emf = lcemf.createNativeEntityManagerFactory(); 

당신은 또한 한번에 XML을 무시하고 LocalContainerEntityManagerFactory을 (setPackagesToScan 참조)를 사용하여 코드를 모두 구성 할 수 있습니다.

3

직접 질문에 답변하지 않지만 응용 프로그램의 구성을 외부화하기 위해 수행하려는 경우 최상의 구성 방법은 연결 설정 등의 모든 구성 가능한 속성을 추출하는 것입니다. 별도의 속성 파일을 createEntityManagerFactory()으로 Map으로 전달합니다 (이 방법으로 persistence.xml에서 속성을 재정의 할 수 있습니다).

그러면 persistence.xml에는 구성 할 수없는 설정 (예 : 영구적 인 클래스 목록 등) 만 포함됩니다. 이자형. 전체 응용 프로그램을 다시 빌드하지 않고 이러한 속성을 변경하는 것은 의미가 없으며 기본 위치에 그대로 둘 수 있습니다.