我对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配置不合适。
如果有人有提示,我做错了,真的很高兴......
谢谢!
我认为最好为数据库连接创建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
我认为最好为数据库连接创建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
我现在有解决问题的方法。
这是相应的配置:
- 玻璃鱼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”时才有效。
我没有试过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>
希望这可以帮助。