2012-01-12 3 views
6

persistence.xml 파일 내의 환경 변수를 읽고 싶습니다.persistence.xml 파일의 환경 변수 읽기

아이디어는 속성 파일을 가져 오는 변경 사항이 있으므로 내 데이터베이스 세부 정보를 속성 파일에서 읽지 않으려한다는 아이디어입니다. 대신 환경 변수에서 세부 정보를 읽고 싶습니다.

이 기준을 달성 할 수있는 방법이 있습니까?

스프링을 사용하는 Iam 내 독립 실행 형 응용 프로그램이 유닉스 컴퓨터에 배포됩니다.

+2

hostname과 같은 데이터베이스 세부 정보는 persistence.xml에 정의되어서는 안됩니다. JNDI 조회를 사용하여 응용 프로그램 서버의 구체적인 데이터베이스 매개 변수를 정의하십시오. – home

+0

안녕하세요, 저는 여기에 어떤 응용 프로그램 서버도 사용하지 않고 있습니다. 유감스럽게도 저는 persistence.xml 파일에 하드 코드 데이터베이스 정보가 필요한 독립 실행 형 응용 프로그램을 실행하고 있습니다. . – Ran

+0

환경 변수 또는 persistence.xml에서 데이터베이스 세부 정보를 가져 오시겠습니까? 두 가지 모두에서 가져오고 싶다고 말하는 것처럼 보이지만, 완전히 명확하지는 않습니다. –

답변

5

맵을 제공하여 지속성 단위의 속성을 업데이트 할 수 있습니다 (this 참조).

환경 변수는 편리하게 Map (this 참조)로 검색 할 수 있습니다.

둘을 함께 넣으면 지속성 단위의 속성을 환경 변수로 동적으로 업데이트 할 수 있습니다.

편집 : 간단한 예 ...

의 persistence.xml ... 업데이트가 환경 변수로 "기본"단위의 persistence.xml

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <provider> 
     oracle.toplink.essentials.PersistenceProvider 
    </provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="toplink.logging.level" value="INFO"/> 
     <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
     <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@myhost:l521:MYSID"/> 
     <property name="toplink.jdbc.password" value="tiger"/> 
     <property name="toplink.jdbc.user" value="scott"/> 
    </properties> 
</persistence-unit> 

코드 ...

Map<String, String> env = System.getenv(); 
Map<String, Object> configOverrides = new HashMap<String, Object>(); 
for (String envName : env.keySet()) { 
    if (envName.contains("DB_USER")) { 
     configOverrides.put("toplink.jdbc.user", env.get(envName)));  
    } 
    // You can put more code in here to populate configOverrides... 
} 

EntityManagerFactory emf = 
    Persistence.createEntityManagerFactory("default", configOverrides); 
+0

안녕하세요 Zack, Iam이 어떻게 persistence.xml에 Map을 제공 할 수 있는지 잘 모르겠습니다.이 샘플 코드를 제공 할 수 있습니까? – Ran

+0

업로드 된 예 - '지속성'을 검색하여 좋은 정보를 찾고 있습니다.xml " –

+0

Hi Zack 위의 코드는 EntityManagerFactory 객체를 만들 때마다 env 변수를 재정의해야합니다.이 경우 EntityManagerFactory를 10 개 클래스에서 변경해야하는 경우 – Ran

1

주입을 통해 생성 된 EM은 여기에서 다루지 않습니다. 더 나쁜 것은 EMF를 통해 생성 된 EM은 EXTENDED (예 : @PersistenceContext (type = PersistenceContextType.TRANSACTION)에 상응하는 EXTENDED와 반대되는 경우에만 해당)입니다. 따라서 트랜잭션 EM이 필요한 경우 주입을 사용해야합니다.

런타임에 persistence.xml 파일을 물리적으로 다시 작성할 수 있는지 궁금합니다. 문제는 하나의 파일을 재 작성하는 능력 (권한, META-INF 등에서 그것을 얻을 수 있음), 그리고 두 번째는 JPA에 의해 처음으로 열리기 전에 다시 쓰는 것입니다. 필드는 실제로 응용 프로그램 코드에 의해 참조됩니다.