2012-02-04 116 views
11

我對玻璃魚,JPA等非常新,我真的遇到了設置問題。我打算做的是一個帶有持久後端的簡單RESTful服務。我正在使用glassfish3作爲應用程序服務器,並且已經使用jersey-library部署了一個簡單的REST服務。現在我想通過JPA提供對數據庫的訪問。 Glassfish隨JavaDB/derby和EclipseLink提供,是嗎?所以,我想使用:-)Persistence.xml與GlassFish 3.1.1

我創建的META-INF一個persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
    <persistence-unit name="myPU" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDataSource" /> <!-- org.apache.derby.jdbc.EmbeddedDriver --> 
     <property name="javax.persistence.jdbc.url"  value="jdbc:derby://localhost:1527/sample;create=true" /> 
     <property name="javax.persistence.jdbc.user"  value="APP" /> 
     <property name="javax.persistence.jdbc.password" value="APP" /> 
     <property name="eclipselink.ddl-generation"  value="create-tables" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

然後我在資源,在這裏我想訪問/存儲SOM數據創建的場:

@PersistenceUnit(unitName = "myPU") 
EntityManagerFactory emf; 

但是, 「EMF」 始終是NULL :-(

我想,我的persistence.xml沒有配置相應的

如果有人有提示,我做錯了什麼,會真的很高興...

謝謝!

回答

5

我現在有解決我的問題的解決方案。 這裏是相應的配置:

  • glassfish 3.1。1
  • 內置JavaDB之外/ Derby數據庫:JDBC/__默認
  • GlassFish的JPA,這是的EclipseLink
  • (JAX RS:澤西島,它隨GlassFish中)

所以,你必須創建文件夾 「META-INF」 wihtin src目錄,並把persistence.xml中有:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
    <persistence-unit name="myPU" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/__default</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

我的WebContent的META-INF創建.XML以前,那是錯誤的。 由於您添加了glassfish模塊,因此您也不必引用任何其他庫。

現在我已經創建了一個JavaBean,在那裏我做注入PersistenceUnit:

@Stateless 
public class StorageService { 

    @PersistenceContext(unitName = "myPU") 
    EntityManager em; 

... 
} 

而這一次在新澤西州的Servlet我的資源,類注:

@Path("/someres") 
@Produces(MediaType.APPLICATION_XML) 
@Stateless 
public class SomeRes { 

    @EJB 
    StorageService storageService; 

... 
} 

注射劑只有在類被標記爲「@Stateless」時纔可以工作。

+0

您的項目中的persistence.xml位置並不重要,它在何處部署。它應該駐留在app.war:/WEB-INF/classes/META-INF/persistence.xml中,但它在app.war中結束:/META-INF/persistence.xml是可疑的。 – 2012-11-28 22:35:02

11

我認爲最好爲數據庫連接創建JNDI。您可以使用GlassFish輕鬆完成。

首先創建連接池(您將設置db連接設置);

資源 - > JDBC-> JDBC連接池

這個池箱子JNDI名稱後;

資源 - > JDBC-> JDBC資源

因此,可以說你設置JNDI名稱爲 「dbCon」

在這裏,你的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="myPU" transaction-type="JTA"> 
    <jta-data-source>dbCon</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties/> 
    </persistence-unit> 
</persistence> 

注意:必須複製您的JDBC JAR到\與GlassFish 3.1.1 \ GlassFish的\域\ DOMAIN1 \ LIB \分機

+0

感謝您的快速響應。我正在使用glassfish的默認derbypool,並將該行更改爲 jdbc/__ default 也將derby.jar添加到該文件夾​​。 此外,我用無狀態和LocalBean註釋了我的類,這是必要的,對嗎? 現在EntityManer不再爲NULL,但我無法保存任何數據,總是得到此錯誤: javax.servlet.ServletException:java.lang.IllegalStateException:無法檢索EntityManagerFactory for unitName myPU – Eddy 2012-02-04 17:35:12

+0

您嘗試ping jdbc連接池上的數據庫 - > Glassfish管理頁面中的DerbyPool。如果在嘗試ping時出現同樣的錯誤,並且此錯誤存在「java.lang.ClassNotFound」,則可以將derby.jar複製到glassfish-3.1.1 \ glassfish \ lib。 – Jman 2012-02-04 23:18:15

+0

Ping可以處理數據庫。我現在找到了解決方案,很快就會發布。您的建議將我推向了正確的方向:)謝謝! – Eddy 2012-02-07 15:33:06

0

我沒有嘗試過與RESTful服務,但我想這不應該物。我注意到你正在爲版本1使用persistence.xml。任何特定的原因?

以下的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="myPU"> 
     <properties> 
      <property name="eclipselink.ddl-generation" value="create-tables" /> 
      <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

希望這有助於。

+0

不,沒有理由^^我想使用JPA 2.0,謝謝你的提示! – Eddy 2012-02-07 15:59:23

相關問題