问题 Glassfish 3.1.1的persistence.xml


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

如果有人有提示,我做错了,真的很高兴......

谢谢!


3938
2018-02-04 00:40


起源



答案:


我认为最好为数据库连接创建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


11
2018-02-04 01:47



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


答案:


我认为最好为数据库连接创建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


11
2018-02-04 01:47



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


我现在有解决问题的方法。 这是相应的配置:

  • 玻璃鱼3.1.1
  • 内置JavaDB / derby数据库:jdbc / __ default
  • glassfish的JPA,这是eclipselink
  • (JAX RS:泽西岛,随玻璃鱼一起发货)

因此,您必须在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”时才有效。


5
2018-02-07 15:44



persistence.xml在项目中的位置并不重要,它在何处部署很重要。它应该驻留在app.war:/WEB-INF/classes/META-INF/persistence.xml中,但它最终在app.war中:/ META-INF/persistence.xml是可疑的。 - Anton Arhipov


我没有试过RESTful服务,但我想这应该不重要。我注意到您使用的是persistence.xml版本1.任何具体原因?

以下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
2018-02-07 15:26



不,没有理由^^我想使用JPA 2.0,感谢提示! - Eddy