2011-10-14 48 views
1

我爲了學習目的做了一個非常簡單的Employee類。我在Glassfish中創建了一個JDBC資源和連接池,並將JPA Facet添加到了我的Eclipse項目中。我現在只是試圖從我的實體生成表,通過右鍵Eclipse項目並使用JPA工具和從實體生成表。而且我還在eclipse中添加了數據庫,並將其連接到它。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,servlet,...)?或瘦客戶端(unitTest,...)? – Balconsky

+0

來自Eclipse。我最近開始做Java EE,所以我還不知道JTA。 – LuckyLuke

回答

4

我認爲JTA只支持GlassFish這樣的容器,而不是來自Eclipse。

要麼添加一個持久性單元與交易類型=「RESOURCE_LOCAL」和從Eclipse中調用這個創建分貝

加上「;創建=真」(爲Apache德比)到連接GlassFish配置中的URL並部署您的應用程序。

您可能還需要設置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

我正在使用Glassfish 3.1和Eclipse 3.7,我無法找到一個JTA鏈接來從表中生成實體來保存我的生活。在過去的幾個小時挖掘和挖掘無濟於事。發佈這個:http://stackoverflow.com/questions/12655257/generate-entities-from-tables-in-glassfish-3-1-for-eclipse-3-7。請幫助 – amphibient

1

您可能需要定義數據源提交您的環境

3

的問題似乎是在你的的persistence.xml,當你定義JTA數據源「的jdbc/testareadb」你實際上應該引用連接池而不是JDBC資源

例如,我的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="MyAppPU" transaction-type="JTA"> 
     <jta-data-source>MyAppPool</jta-data-source> 
    </persistence-unit> 
</persistence> 

然後我需要創建一個JDBC資源名爲「的jdbc/MyAppDS」在Glassfish和命名連接池「 MyAppPool「即將引用我的persistence.xml。得到它了?

如果你不知道如何做到這一點的Glassfish的控制檯,來看看這篇文章: http://gardiary.wordpress.com/2009/07/30/create-jdbc-connection-pool-and-resource-in-glassfish/

+1

如果我的答案有幫助,您可以讓我知道嗎? –

+0

非常感謝!你的回答解決了我的問題! – ceklock

0

什麼你一定錯過persistence.xml(儘管它不是爲javax.naming.NamingException的原因)是名單你的持久類(ES)—的我不熟悉的EclipseLink,但是這表明它:

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

添加類名到您的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence (...)> 
    <persistence-unit name="TestAreaPU"> 
     <jta-data-source>jdbc/testareadb</jta-data-source> 
     <class>fully-qualified-name-of-Employee</class> 
    </persistence-unit> 
</persistence> 
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規範,參數transaction-type是可選的,在瘦客戶端和默認值爲resource-local,在容器事務處爲JTA

而不是jta-data-source更好的屬性添加到persistence.xml中 Exapmle高於:

<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> 

祝你好運!