【问题标题】:persistence.xml with Glassfish 3.1.1带有 Glassfish 3.1.1 的 persistence.xml
【发布时间】:2012-02-26 14:04:31
【问题描述】:

我对 glassfish、JPA 等非常陌生,我在设置这些方面确实存在问题。我打算做的是一个带有持久后端的简单 RESTful 服务。我正在使用 glassfish3 作为应用程序服务器,并且已经使用 jersey-library 部署了一个简单的 REST 服务。现在我想通过 JPA 提供对数据库的访问。 Glassfish 附带 JavaDB/derby 和 EclipseLink,对吗?所以,我想用那个:-)

我在 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 配置不合适。

如果有人有提示我会很高兴,我做错了什么......

谢谢!

【问题讨论】:

    标签: jpa glassfish eclipselink persistence.xml


    【解决方案1】:

    我认为最好为数据库连接创建 JNDI。您可以使用 GlassFish 轻松完成。

    首先创建连接池(您将设置数据库连接设置);

    资源->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\domains\domain1\lib\ext

    【讨论】:

    • 感谢您的快速回复。我正在使用 glassfish 的默认 derbypool 并将行更改为 jdbc/__default 还将 derby.jar 添加到该文件夹​​中。另外,我用 Stateless 和 LocalBean 注释了我的类,这是必要的,对吧?现在 EntityManer 不再为 NULL,但我无法保留任何数据,总是收到此错误:javax.servlet.ServletException: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName myPU
    • 您是否尝试在 jdbc 连接池上 ping 数据库 -> glassfish 管理页面的 DerbyPool。如果您在尝试 ping 时遇到同样的错误并且如果此错误存在 "java.lang.ClassNotFound" ,您可以将您的 derby.jar 复制到 glassfish-3.1.1\glassfish\lib 。
    • Ping 确实适用于数据库。我现在找到了解决方案,很快就会发布.. 你的建议把我推向了正确的方向 :) 谢谢!
    • 嘿,还有一个问题:看来你很擅长 glassfish :) 我的数据总是丢失,在我重新编译我的代码之后.. 似乎数据库不是持久的.. =/我的配置中是否缺少某些内容?
    • 您将 persistence.xml 属性设置为 drop-and-create-tables 。这将在您编译代码时删除所有表并重新创建。如果你不想这样,你可以把它改成“create”或“none”。
    【解决方案2】:

    我没有尝试过 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>
    

    希望这会有所帮助。

    【讨论】:

    • 不,没有理由^^我想使用JPA 2.0,谢谢提示!
    【解决方案3】:

    我现在有了解决问题的方法。 下面是对应的配置:

    • glassfish 3.1.1
    • 内置 JavaDB/derby 数据库:jdbc/__default
    • glassfish 的 JPA,即 eclipselink
    • (JAX RS:Jersey,随 glassfish 一起发货)

    因此,您必须在 src 文件夹中创建文件夹“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 模块。

    现在我创建了一个 JavaBean,并在其中注入 PersistenceUnit:

    @Stateless
    public class StorageService {
    
        @PersistenceContext(unitName = "myPU")
        EntityManager em;
    
    ...
    }
    

    这个被注入到我的 Jersey-Servlets 的资源类中:

    @Path("/someres")
    @Produces(MediaType.APPLICATION_XML)
    @Stateless
    public class SomeRes {
    
        @EJB
        StorageService storageService;
    
    ...
    }
    

    只有当类被标记为“@Stateless”时,注入才会起作用。

    【讨论】:

    • persistence.xml 在您的项目中的位置并不重要,重要的是它的部署位置。它应该驻留在 app.war:/WEB-INF/classes/META-INF/persistence.xml 但最终出现在 app.war:/META-INF/persistence.xml 是可疑的。
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多