2012-02-04 16 views
11

私はglassfish、JPAなどにはとても新しいので、設定には本当に問題があります。私がしようとしているのは、永続的なバックエンドを持つ単純なRESTfulなサービスです。私はアプリケーションサーバーとしてglassfish3を使用しており、すでにjersey-libraryで簡単なRESTサービスを展開しています。今、JPA経由でデータベースへのアクセスを提供したいと思います。 GlassfishはJavaDB/derbyとEclipseLinkに同梱されています、そうですか?Glassfishでのpersistence.xml 3.1.1

<?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のデータにアクセスしたい私のリソース、のフィールドを作成:だから、私は、META-INF内のpersistence.xmlを作成した:-)

それを使用したいです:

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

しかし、 "EMFは、" 私は私のpersistence.xmlが適切に構成されていないことを推測

:-(常にNULLです

誰かがヒントを持っている場合、私は間違っていると本当にうれしいでしょう...

ありがとう!

答えて

5

私は現在、私の問題の解決方法を持っています。 対応する構成は次のとおりです。

  • glassfish 3.1。1
  • 内蔵のJavaDB/Derbyデータベースます。jdbc/__デフォルト
  • のEclipseLink
  • でのGlassFishのJPA、(JAXのRS:ジャージー、GlassFishのに同梱されている)ので

を、あなたがする必要はありあなたのsrcフォルダwihtinフォルダ "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> 
    <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モジュールが追加されているので、追加のライブラリを参照する必要もありません。

今、私はPersistenceUnitを注入行うのJavaBean、作成しました:

@Stateless 
public class StorageService { 

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

... 
} 

をそして、この1はジャージー - サーブレットの私のリソース・クラスに注入されています

@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は容疑者です。 –

11

DB接続用にJNDIを作成する方が良いと思います。 GlassFishを使用して簡単に行うことができます。

最初に接続プールを作成します(db接続設定を行います)。このプールのためにそのクレートのJNDI名の後

リソース - > JDBC-> JDBC接続プール

に。

リソース - > JDBC-> JDBCリソース

ですから、 "DBCON"

そして、ここであなたのpersistence.xmlとしてJNDI名を設定して言うことができます。

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

注:私はRESTfulなサービスを試していませんが、私はそれがいけないと思うのglassfish-3.1.1 \ GlassFishの\ドメイン\ DOMAIN1 \ libに\ extに

+0

お返事ありがとうございます。私はglassfishのデフォルトのderbypoolを使用していて、その行を jdbc/__ default に変更し、そのフォルダにderby.jarも追加しました。 また、クラスにStatelessとLocalBeanを注釈しました。これは必要です。 EntityManerはもはやNULLではありませんが、データを保持することができません。常にこのエラーが発生します。 javax.servlet.ServletException:java.lang.IllegalStateException:unitName myPUのEntityManagerFactoryを取得できません – Eddy

+0

pingを試みましたかjdbc接続プールのデータベース - > glassfish管理ページのDerbyPool pingを実行するときに同じエラーが発生し、このエラーが "java.lang.ClassNotFound"であれば、derby.jarをglassfish-3.1.1 \ glassfish \ libにコピーできます。 – Jman

+0

Pingはデータベースで動作します。私は解決策を今すぐ見つけ、すぐにそれを掲示するでしょう。あなたのアドバイスは正しい方向に私を押し込んだ:)ありがとう! – Eddy

0

\するには、JDBCのjarファイルをコピーする必要があります問題。私は、バージョン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

関連する問題