13

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

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

谢谢!

4

3 回答 3

12

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

于 2012-02-04T01:47:24.873 回答
5

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

  • 玻璃鱼 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”时,注入才会起作用。

于 2012-02-07T15:44:20.363 回答
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>

希望这可以帮助。

于 2012-02-07T15:26:43.520 回答