JPA Неизвестный источник - PullRequest
0 голосов
/ 27 марта 2012

Я создаю свое первое JPA-приложение с использованием NetBeans. Я не могу заставить настойчивость работать. Подключение к базе данных работает хорошо, когда я запускаю приложение, создаются таблицы базы данных. Но когда я пытаюсь создать EntityManagerFactory:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("PISProjektPU");

Я получаю:

INFO: javax.persistence.PersistenceException: [PersistenceUnit: PISProjektPU] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:78)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at cz.vutbr.fit.pis.spravaTechniky.service.TestManager.<init>(TestManager.java:28)
    at cz.vutbr.fit.pis.spravaTechniky.service.__EJB31_Generated__TestManager__Intf____Bean__.<init>(Unknown Source)
...

Мой файл persistence.xml выглядит следующим образом (сгенерирован NetBeans, я ничего не менял):

<?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="PISProjektPU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/myslq_spravaTechniky</jta-data-source>
    <class>cz.vutbr.fit.pis.spravaTechniky.data.TestEntity</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
    </properties>
</persistence-unit>
</persistence>

и он находится здесь:

src/conf/persistence.xml
build/web/WEB-INF/classes/META-INF/persistence.xml

Я искал на форуме и нашел несколько советов, как убрать эту ошибку, но я не смог заставить ее работать. Я пытался добавить эти две строки в Manifest.mf:

Meta-Persistence: META-INF/persistence.xml
JPA-PersistenceUnits: PISProjektPU

Я пытался переместить файл persistence.xml во все возможные места. Я также добавил все библиотеки, которые казались мне полезными, когда я захожу в Свойства / Библиотеки, я вижу:

Java EE 6 API Library
Hibernate
Java-EE-GlassFish-v3
EclipseLink(JPA 2.0)
EclipseLink-GlassFish-v3
Hibernate JPA
JSF 2.0
Java EE Web 6 API Library
Persistence

Я уверен, что совершаю какую-то глупую простую ошибку, но после дня, пытаясь сделать эту работу, я не могу понять, в чем проблема. Честно говоря, сейчас я совершенно не понимаю, куда поместить файл или как все настроить, поэтому я случайно пробую разные вещи. Буду благодарен за любые советы!

Edit:

Спасибо за предложение. Мои тестовые классы на самом деле выглядят так:

Класс TestManager:

@Stateless
public class TestManager {
    @PersistenceContext 
    private EntityManager em;

    public void save(TestEntity t) {
        em.merge(t);
    }

    public void remove(TestEntity t) {
        em.remove(em.merge(t));
    }

    public void create(TestEntity t) {
        em.persist(t);
    }

    @SuppressWarnings("unchecked")
        public List<TestEntity> findAll() {
        return em.createQuery("SELECT t FROM TestEntity t").getResultList();
    }
}

Класс TestBean:

@Named(value="testBean")
@Dependent
public class TestBean {

    @EJB
    private TestManager testManager;

    /** Creates a new instance of TestBean */
    public TestBean() {
    }

    public List<TestEntity> getEntities() {
        return this.testManager.findAll();
    }

}

Я вызываю метод TestBean.getEntities:

...
<h:dataTable value="#{testBean.entities}" var="entity">
...

Это вызывает следующее исключение:

javax.ejb.EJBException
at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5119)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5017)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4805)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
at $Proxy141.findAll(Unknown Source)
at cz.vutbr.fit.pis.spravaTechniky.service.__EJB31_Generated__TestManager__Intf____Bean__.findAll(Unknown Source)
at cz.vutbr.fit.pis.spravaTechniky.back.TestBean.getEntities(TestBean.java:27)
...

Я пытался заменить @PersistenceContext на @EJB, но получил javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB.

Ответы [ 3 ]

0 голосов
/ 27 марта 2012

Несколько вещей, чтобы исправить здесь:

  1. Во-первых, вы смешиваете Hibernate и EclipseLink в одном приложении (почему ??), вам просто нужно использовать одно из них, выбрать между Hibernate или EclipseLink, так как оба являются реализациями одного и того же стандарта: JPA (и вам нужно будет выбрать JPA API от одной из этих реализаций).
  2. Попробуйте заменить аннотацию @EJB на @Inject. С тем стеком, который вы используете, он должен работать.
  3. Использование «зависимой псевдоскопы» (с помощью аннотации @Dependent) - это то же самое, что совсем не устанавливать область (без аннотации). Удалите аннотацию @Dependent из вашего класса бобов и поместите туда @RequestScoped (@SessionScoped, @ApplicationScoped или любой другой объем, который должен иметь ваш бин).
0 голосов
/ 29 мая 2012

В конце концов, я заставил JPA работать, просто используя один из примеров проектов в NetBeans (Файл> Новый проект> Образцы> Java Web> JSF JPA). Я использовал это в качестве основы для своего проекта. Я не уверен, что я делал неправильно, но тогда все работало нормально. В любом случае, спасибо за помощь!

0 голосов
/ 27 марта 2012

попробуйте использовать это

@EJB
EntityManager em;
em.persist(someobject);

вместо фабрики, если вам нужно использовать фабрику, я предлагаю вам повторить шаги по настройке персистентности сущностей в вашей IDE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...