2013-10-03 2 views
9

편집 : not duplicate but almost의 persistence.xml

나는 간단한에서 이러한 자리 값을 받고 뭔가 같은

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
       version="1.0"> 
    <persistence-unit name="appName" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="${db.dialect'}"/> 
      <property name="javax.persistence.jdbc.driver" value="${db.driver}"/> 
      <property name="javax.persistence.jdbc.user" value="${db.user}"/> 
      <property name="javax.persistence.jdbc.password" value="${db.password}"/> 
      <property name="javax.persistence.jdbc.url" value="${db.url}"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

될 내 응용 프로그램의 persistence.xml을하고 싶습니다 내 원본 폴더 어딘가에 텍스트 파일.

난 그냥 최대 절전 모드 및 일부 Primefaces,

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:com/foo/jdbc.properties</value> 
    </property> 
</bean> 

같은 일을하지만, 여기에 우리가 스프링을 사용하지 않는 스프링을 사용하는 경우이 가능하다는 읽은.

가능합니까?

감사합니다.

편집 : 몇 가지 언급은하지 않았지만 참고로 Shiro Security와 Ant를 사용하여 몇 가지 작업을 수행했습니다. 솔루션을 답변으로 게시하겠습니다. (개미의 이동 경로 작업에 대한)

  • 의 persistence.xml (최대 절전 모드)
  • 의 context.xml (시로)
  • database.properties :이 내 프로젝트가 데이터베이스 매개 변수와 3 개 개의 파일이 있습니다

답변

1

가 나는 시로 보안, t를 사용하고 언급 편집 : 키 = 값) 및 예를 들어, createEntityManagerFactory() 방법에 Properties 개체를 전달 모자에는 데이터베이스 매개 변수가 필요합니다. 나는 context.xml에서이 위치를 유지하고 다른 위치에서 그것을 참조하는 데이터베이스 매개 변수 위치를 1 개만 필요로했습니다.

1) 개미의 context.xml

의 context.xml가

<target name="init-flyway"> 
    <property name="flyway.url" value="${Resource.url}" /> 
    <property name="flyway.user" value="${Resource.username}" /> 
    <property name="flyway.password" value="${Resource.password}" /> 
    <!-- stuff stuff stuff --> 
</target> 
를 사용하여 액세스 후 개미의 build.xml

<xmlproperty file="/path/to/context.xml" keepRoot="false" semanticAttributes="true" includeSemanticAttribute="true" /> 

에 사용 않았다

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <!-- Other stuff... --> 

    <!-- Shiro's --> 
    <Resource name="jdbc/postgres" auth="Container" 
     type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" 
     url="jdbc:postgresql://url-to-db/database" 
     username="user" password="pass" /> 
</Context> 

갖는 읽기

2) persistence.xml 문맥을 읽는다.XML

<non-jta-data-source>java:/comp/env/jdbc/postgres</non-jta-data-source> 

그래서, 내가 3 개 데이터베이스 매개 변수에 도움을 단지 1

감사를 살해 this

사용하여 문맥의 데이터 저장소를 사용할 수 있습니다!

2

Maven을 빌드 시스템으로 사용하는 경우 Maven 필터를 사용하여 빌드하는 동안 값을 바꿀 수 있습니다.

또는 당신은 (내부 스프링 자체에 의해 사용되는) 간단한 속성 자리 교체를 작성할 수

참조 : https://stackoverflow.com/a/14724719/477435

+0

실제로 우리는 Ant를 사용하여 빌드하고 있습니다. 미안하지만, 내가 오해했다고 생각합니다 ... 자바 클래스를 사용하여 일부 자리 표시 자에 값을 넣으시겠습니까? – paulochf

+0

실제로 속성 파일에서 읽음으로써 자리 표시 자 값을 바꿀 수있는 Java 클래스를 사용하고있었습니다. 그러나 제시된 답변 아래에서는 persistence.xml의 사용을 제거하고 속성 파일 만 사용할 수있는 곳이 훨씬 좋습니다. – Gireesh

15

persistence.xml 내부의 속성을 정의하는 것은 당신은 (표준 등록 정보 파일에 정의 할 수 있습니다 대신에

Properties props = new Properties(); 
props.load(new FileInputStream("/some/path/persistence.properties")); 
EntityManagerFactory factory = Persistence.createEntityManagerFactory("appName", props); 
+0

필자가 내 솔루션을 찾지 못했다면 분명히 이것을 사용할 것임을 언급한다. – paulochf

+4

그냥 알림. 속성 파일에서 전체 속성 이름 (예 : "사용자"대신 "javax.persistence.jdbc.user" – McCoy

+0

왜 이런 이유가 전에 내가 이것을 발견하지 못했습니까? –