persistence.xml с Glassfish 3.1.1 - PullRequest
       51

persistence.xml с Glassfish 3.1.1

12 голосов
/ 04 февраля 2012

Я очень новичок в Glassfish, JPA и так далее, и у меня действительно проблемы с настройкой. Я планирую сделать простой RESTful-сервис с постоянным бэкэндом. Я использую glassfish3 в качестве сервера приложений и уже развернул простую службу REST с библиотекой jersey. Теперь я хочу предоставить доступ к базе данных через JPA. Glassfish поставляется с JavaDB / derby и 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>

Затем я создал поле в своем ресурсе, где я хочу получить доступ / сохранить данные сома:

@PersistenceUnit(unitName = "myPU")
EntityManagerFactory emf;

Но "ЭДС" всегда имеет значение NULL: - (

Я полагаю, что мой файл persistence.xml настроен неправильно.

Был бы очень рад, если у кого-то есть подсказка, что я делаю не так ...

спасибо!

Ответы [ 3 ]

11 голосов
/ 04 февраля 2012

Я думаю, что лучше создать JNDI для соединения с БД.Вы можете легко это сделать с помощью GlassFish.

Сначала создайте пул соединений (вы установите параметры соединения с БД);

Ресурсы-> JDBC-> Пулы соединений JDBC

После этого создайте имя JNDI для этого пула;

Resources-> JDBC-> JDBC Resources

Итак, допустим, вы задали имя 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>

Примечание. Вы должны скопировать jar-файл jdbc в папку \ glassfish-3.1.1 \ glassfish \ domains \ domain1 \ lib \ ext

5 голосов
/ 07 февраля 2012

У меня есть решение для моей проблемы.Вот соответствующая конфигурация:

  • glassfish 3.1.1
  • встроенная база данных JavaDB / derby: jdbc / __ default
  • JPA glassfish, то есть 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, и это неправильно.Вам также не нужно ссылаться на какие-либо дополнительные библиотеки, поскольку у вас есть добавленные модули glassfish.

Теперь я создал 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".

0 голосов
/ 07 февраля 2012

Я не пробовал с сервисом 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>

Надеюсь, это поможет.

...