2011-03-01 4 views
0

저는 JPA를 처음 사용하고 있으며, 스스로 가르치려고 노력하고 있습니다. 작은 웹 응용 프로그램을 설치하고 Glassfish 3.1에 배포하고 있습니다.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="foo" transaction-type="JTA"> 
     <jta-data-source>jdbc/foo</jta-data-source> 
     <class>my.app.Foo</class> 
    </persistence-unit> 
</persistence> 

그러나 지금까지 내가 이해, 내 모든 데이터베이스 연결 설정을 넣을 수 있어야한다 : 나는 이와 같은,이 persistence.xml에 JNDI 데이터 소스를 참조 할 때

JPA 잘 작동합니다 persistence.xml의 특성으로 변환하십시오. 이것은 좋은 습관은 아닐지 모르지만, 제가 실험하고있을 때, 그리고 아마도 유닛 테스팅 중에는 편리 할 것 같습니다.

그러나 내가 찾은 예제를 따르면 persistence.xml은 무시되고 대신 기본 컨테이너 관리 데이터 소스 인 jndi/__ default가 사용됩니다. 이것은 실행 중이 아닌 Derby 인스턴스입니다.

나는 임시 메모리 더비 예를 들어이 파일을 시도했다 :

<?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_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="foo" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>my.app.Foo</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:NxtMv;create=true"/> 
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/> 
      <property name="javax.persistence.jdbc.user" value=""/> 
      <property name="javax.persistence.jdbc.password" value=""/> 
      <property name="eclipselink.ddl-generation" value="create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

가 나는 또한 (JNDI를 통해 액세스 할 때 작동하는)는 PostgreSQL 서버에 대해이 작업을 시도했다 :

<?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_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="foo" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>my.app.Foo</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/foo"/> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="myuser"/> 
      <property name="javax.persistence.jdbc.password" value="secret"/> 
      <property name="eclipselink.ddl-generation" value="create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

내 수많은 시도와 재시도 중에 누적 된 파일에는 관련성이없는 중요한 요소가있을 수 있습니다.

무엇이 여기에 있습니까?

답변

1

수동으로 구성된 데이터 소스를 transaction-type="JTA"과 함께 사용할 수 없습니다.

JPA 사양은 말한다 :

JTA 의 트랜잭션 유형은 JTA 데이터 소스가 제공-중 하나 될 것이라는 JTA - 데이터 소스 요소 에 의해 지정되거나 컨테이너에 의해 제공되는 가정합니다.

대신 transaction-type="RESOURCE_LOCAL"을 사용해보십시오 (사용하는 경우 컨테이너 관리 트랜잭션과 어떻게 작동하는지 잘 모르겠지만).

+0

나는 이것을 시도했지만, 당신 말이 맞습니다. 이것은 "트랜잭션 유형이 JTA 인 지속성 단위 만 컨테이너 관리 엔티티 관리자로 사용할 수 있습니다."라는 오류를 표시합니다. 내가 배치하려고 할 때. RESOURCE_LOCAL을 (를) 사용할 수 있고 여전히 배포 할 수있는 시나리오는 무엇입니까? –

+0

@ 코더 : JTA 데이터 소스 없이는 contrainer-managed 트랜잭션을 사용할 수 없다는 것을 이해합니다. 즉, 수동으로 구성된 데이터 소스를 사용하려면 (Persistence.createEntitiyManagerFactory()를 통해 얻은 영속 컨텍스트에서) 수동으로 트랜잭션을 관리해야합니다. 그것은 EJB의 한 가지 더 융통성없는 것처럼 보입니다. – axtavt

+0

@Coder Doe : 컨테이너 관리 트랜잭션을 사용하는 경우 JTA 데이터 소스를 사용할 수 밖에 없습니다. 나는 이것이 곧 바뀔 것이라고 생각하지 않는다! JTA를 직접 지원하는 서버는 Glassfish, JBoss, Websphere입니다. 비 JTA 서버 : Tomcat. – ChuongPham

관련 문제