Persistence.xml с Glassfish 3.1.1
Я очень новичок в Glassfish, JPA и т.д., и у меня действительно проблемы с настройкой. То, что я планирую сделать, - это простой сервис RESTful с постоянным бэкэнд. Я использую glassfish3 в качестве сервера приложений и уже развернул простую службу REST с библиотекой jersey. Теперь я хочу предоставить доступ к базе данных через JPA. Glassfish поставляется с JavaDB/дерби и EclipseLink, верно? Итак, я хочу использовать это: -)
Я создал файл persistence.xml в META-INF:
<?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 не настроен соответствующим образом.
Было бы очень приятно, если у кого-то есть намек, что я делаю неправильно...
спасибо!
Ответы
Ответ 1
У меня есть решение для моей проблемы.
Вот соответствующая конфигурация:
- glassfish 3.1.1
- встроенная база данных JavaDB/derby: jdbc/__ default
- стеклянная рыба JPA, которая является eclipselink
- (JAX RS: Джерси, который поставляется с морской рыбкой)
Итак, вам нужно создать папку "META-INF" в вашей папке 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>
Я создал .xml ранее в META-INF из WebContent, и это неправильно.
Вам также не нужно ссылаться на какие-либо дополнительные библиотеки, так как у вас есть модули для стеклянной рыбы.
Теперь я создал JavaBean, где я вставляю PersistenceUnit:
@Stateless
public class StorageService {
@PersistenceContext(unitName = "myPU")
EntityManager em;
...
}
И этот вводится в моих ресурсных классах Джерси-Сервлеты:
@Path("/someres")
@Produces(MediaType.APPLICATION_XML)
@Stateless
public class SomeRes {
@EJB
StorageService storageService;
...
}
Инъекции выполняются, только если классы отмечены как "@Stateless".
Ответ 2
Я думаю, что лучше создать JNDI для соединения db. Вы можете сделать это легко с помощью 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\domains\domain1\lib\ext
Ответ 3
Я не пробовал службу 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>
Надеюсь, что это поможет.