2011-10-14 2 views
1

나는 학습 목적으로 만 단순한 Employee 클래스를 만들었습니다. Glassfish에서 JDBC 자원과 연결 풀을 만들고 Eclipse 프로젝트에 JPA Facet을 추가했습니다. 지금은 Eclipse 프로젝트를 rightcliking하고 JPA Tools를 사용하고 엔터티에서 테이블을 생성하여 Entity에서 테이블을 생성하려고합니다. 그리고 나는 또한 이클립스에 데이터베이스를 추가하고 그것에 연결되어 있습니다.EJB, JPA 및 Eclipse와의 연결 문제

의 persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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"> 
    <persistence-unit name="TestAreaPU"> 
     <jta-data-source>jdbc/testareadb</jta-data-source> 
    </persistence-unit> 
</persistence> 

직원 엔티티

@Entity 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String firstName; 
    private String lastName; 

    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

오류

[EL Warning]: PersistenceUnitInfo testareapu has transactionType RESOURCE_LOCAL and therefore jtaDataSource will be ignored 
[EL Info]: EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 
[EL Fine]: Detected Vendor platform: org.eclipse.persistence.platform.database.JavaDBPlatform 
[EL Config]: Connection(771811155)--connecting(DatabaseLogin( platform=>JavaDBPlatform user name=>"APP" datasource URL=>"jdbc:derby://localhost:1527/testareadb;create=true")) 
[EL Config]: Connection(1028854205)--Connected: jdbc:derby://localhost:1527/testareadb;create=true User: APP Database: Apache Derby Version: 10.6.2.1 - (999685) Driver: Apache Derby Network Client JDBC Driver Version: 10.8.1.2 - (1095077) 
[EL Config]: Connection(414297791)--connecting(DatabaseLogin( platform=>JavaDBPlatform user name=> "APP" datasource URL=>"jdbc:derby://localhost:1527/testareadb;create=true")) 
[EL Config]: Connection(960989763)--Connected: jdbc:derby://localhost:1527/testareadb;create=true User: APP Database: Apache Derby Version: 10.6.2.1 - (999685) Driver: Apache Derby Network Client JDBC Driver Version: 10.8.1.2 - (1095077) 
[EL Info]: file:/C:/Users/Andreas/TestAreaEJB/build/classes/_testareapu_url=jdbc:derby://localhost:1527/testareadb;create=true_user=APP login successful 
[EL Warning]: The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units. Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element 
[EL Config]: Connection(1028854205)--disconnect 
[EL Info]: file:/C:/Users/Andreas/TestAreaEJB/build/classes/_testareapu_url=jdbc:derby://localhost:1527/testareadb;create=true_user=APP logout successful 
[EL Config]: Connection(771811155)--disconnect 
[EL Config]: Connection(960989763)--disconnect 

새로운 오류 :

[EL Severe]: Local Exception Stack: 
Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Cannot acquire data source [jdbc/testareadb]. 
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]] 
    at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:485) 
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:109) 
    at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268) 
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.perform(Main.java:86) 
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:77) 
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:64) 
Caused by: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:654) 
    at javax.naming.InitialContext.lookup(InitialContext.java:396) 
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:103) 
    ... 11 more 
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr] 
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504) 
    ... 15 more 
Caused by: java.lang.RuntimeException: Orb initialization erorr 
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180) 
    at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365) 
    at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372) 
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402) 
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347) 
    ... 16 more 
Caused by: java.lang.NullPointerException 
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152) 
    ... 20 more 

Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Cannot acquire data source [jdbc/testareadb]. 
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]] 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:501) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268) 
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.perform(Main.java:86) 
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:77) 
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:64) 
Caused by: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Cannot acquire data source [jdbc/testareadb]. 
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]] 
    at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:485) 
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:109) 
    at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472) 
    ... 7 more 
Caused by: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:654) 
    at javax.naming.InitialContext.lookup(InitialContext.java:396) 
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:103) 
    ... 11 more 
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr] 
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504) 
    ... 15 more 
Caused by: java.lang.RuntimeException: Orb initialization erorr 
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180) 
    at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365) 
    at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372) 
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402) 
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347) 
    ... 16 more 
Caused by: java.lang.NullPointerException 
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152) 
    ... 20 more 
+0

어디에서 연결 (호스트, 암호, ...)을 구성합니까? 그리고이 연결을 어떻게 실행합니까? 이 컨테이너 트랜잭션 (EJB, 서블릿, ...)입니까? 또는 씬 클라이언트 (unitTest, ...)? – Balconsky

+0

Eclipse에서. 나는 최근에 Java EE를 시작 했으므로 JTA에 대해서는 아직 모릅니다. – LuckyLuke

답변

4

JTA는 GlassFish와 같은 컨테이너에서만 지원되며 Eclipse에서는 지원되지 않는다고 생각합니다.

어느 트랜잭션 타입 = "RESOURCE_LOCAL의"지속성 유닛을 추가하고 DB를

또는

추가 생성 이클립스에서이 전화 "= 참 생성"(아파치 더비) 연결에 URL을 GlassFish 구성에 저장하고 응용 프로그램을 배포하십시오.

또한 "테이블을 만들"또는 위해 eclipselink.ddl 세대의 속성을 설정할 수 있습니다

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Extensions_for_Schema_Generation

+0

이 답변은 저에게는 효과적 이었지만, 프로젝트를 만들려고 할 때마다 엔티티가 매핑되지 않았다고 말합니다. –

+0

RESOURCE_LOCAL을 사용하고 있습니까? – Puce

+0

Eclipse 3.7에서 Glassfish 3.1을 사용하고 있으며 테이블에서 엔티티를 생성하여 JTA 링크를 찾을 수 없습니다. 지난 몇 시간 동안 파고 파고 있었고 아무 소용이 없었습니다. 게시일 : http://stackoverflow.com/questions/12655257/generate-entities-from-tables-in-glassfish-3-1-for-eclipse-3-7. 제발 도와주세요 – amphibient

1

당신은 데이터 소스를 정의해야 할 수도 있습니다 "드롭 - 앤 - 테이블을 생성" 사용자 환경에 맞게 파일을

문제는, 당신의 의 persistence.xml 것 같다
3

당신은 JTA 데이터 소스 "JDBC/testareadb" 실제로 연결 풀을 참조해야합니다를 정의 할 때이고 JDBC 자원은입니다.

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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"> 
    <persistence-unit name="MyAppPU" transaction-type="JTA"> 
     <jta-data-source>MyAppPool</jta-data-source> 
    </persistence-unit> 
</persistence> 

가 그럼 난 JDBC 자원은 글래스 피시에서 "JDBC/MyAppDS" 이름과 연결 풀 이름 "만들 필요 : 예를 들어

persistence.xml을이 같은 것입니다 MyAppPool "persistence.xml에 의해 참조되는입니다. 알았다?

당신은, 글래스 피시 콘솔에 그것을 할이 문서에서 살펴 가지고하는 방법을 모르는 경우 : (가 javax.naming.NamingException에 대한 이유없는 비록) http://gardiary.wordpress.com/2009/07/30/create-jdbc-connection-pool-and-resource-in-glassfish/

+1

내 대답이 도움이되면 알려주실 수 있습니까? –

+0

대단히 고마워요! 당신의 대답이 내 문제를 해결했습니다! – ceklock

0

당신이 반드시 persistence.xml에 놓칠 무엇을 목록입니다 당신의 영속 클래스 (들) —의 나는 EclipseLink가 익숙하지 해요,하지만 그것을 제안 :

[EL Warning]: The collection of metamodel types is empty. (...) 

당신의 persistence.xml에 클래스 이름을 추가

처음에는
2

, 내가 엔티티를 할 경우에, 나는 테이블 및 열 이름을 지정 싶습니다

@Entity 
@Table (name = "Employee") 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column (name = "firstName") //name is optional, default this is fieldName 
    private String firstName; 
    @Column (name = "lastName") 
    private String lastName; 

    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

당신이 <jta-data-source>jdbc/testareadb</jta-data-source>를 사용하는 경우, 당신은 서버에 리소스를 구성한다는 의미는 glasfish 관리 콘솔을 여기서 JDBC/던져 testareadb는 자원의 JNDI 이름입니다. 처음에만 초보자 인 경우 처음에는 권장하지 않습니다.

JPA 2.0에 따르면 spec 매개 변수 transaction-type은 선택 사항이며 기본값은 씬 클라이언트에서 resource-local이며 컨테이너 트랜잭션에서는 JTA입니다.

<persistence-unit name="Unit-name" > 
<class>com.yourCompany.db.Employee</class> 
<properties> 
     <property name="eclipselink.target-database" value="DERBY"/> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/chapter02DB;create=true"/> 
     <property name="eclipselink.jdbc.user" value="userName"/> 
     <property name="eclipselink.jdbc.password" value="userPassword"/> 
    </properties> 
</persistence-unit> 

행운을 대신 jta-data-source

더 나은 Exapmle 위입니다 을 persistence.xml을하는 속성을 추가!