2012-02-04 101 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

相关问题