Как отсоединить сущность (JPA 2.0 / EclipseLink / JBoss) - PullRequest
2 голосов
/ 18 декабря 2011

Мне нужно отсоединить некоторые объекты сущностей от базы данных, чтобы сделать их неуправляемыми. Я использую поставщик сохраняемости EclipseLink, метод которого EntityManager.detach () является именно тем, который мне нужен. Проблема в том, что JBoss создает во время выполнения следующее исключение (когда выполнение переходит к detach ()):

javax.ejb.EJBTransactionRolledbackException: Unexpected Error
java.lang.NoSuchMethodError: javax.persistence.EntityManager.detach(Ljava/lang/Object;)V

Другие методы, такие как persist, merge, find, работают нормально. Я попробовал Hibernate и знаю, что его Session предоставляет специальный метод evict (), который отсоединяет сущность, но у EclipseLink такого метода нет. Пример использования detach ():

@PersistenceContext(unitName="Course7-ejbPU")
protected EntityManager manager;
(...)
Query query;
List<Message> resultList;
query = manager.createNamedQuery("Message.getUserInputMessageList");
query.setParameter("login", login);
query.setMaxResults(5);
resultList = query.getResultList();
for (Message message : resultList)
    if (message.getContent().length() > 50)
    {
        manager.detach(message);              
        message.setContent(message.getContent().substring(0, 50) + "...");
    }

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="Course7-ejbPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:/Course7ds</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="eclipselink.target-server" value="JBoss"/>
    </properties>
  </persistence-unit>
</persistence>

Библиотека с данными провайдера включена в ушной архив. Версия EclipseLink - 2.2.0 (протестирована с 2.3.2 - без разницы), версия сервера JBoss 5.1.0. Любые предложения будут оценены.

Ответы [ 2 ]

3 голосов
/ 18 декабря 2011

Это исключение показывает, что вы используете не JPA2, а JPA1.Возможно, вам следует использовать более свежую версию JBoss, которая поставляется с JPA2.

2 голосов
/ 19 декабря 2011

Вы скомпилировали свой код с классами JPA 2.0, но запустили его с JPA 1.0. Вот почему JVM не находит метод отсоединения.

В ответ на ваш комментарий: нет, метод detach не бесполезен для пользователя JPA 1.0: просто он еще не создан. Однако вы можете стереть весь кэш L1, вызвав clean () на диспетчере сущностей, который отсоединит все ваши управляемые сущности ...

Вы по-прежнему можете отсоединять сущность, используя код, специфичный для поставщика сохраняемости. Не потому, что менеджер сущностей пока не предоставляет функцию, провайдеры jpa еще не реализовали ее.

Если вы можете немного связать свой код с вашим провайдером jpa: Вы можете вызвать метод em.getDelegate (), который вернет вам реализацию менеджера сущностей EclipseLink (проверьте отладку возвращенного значения и приведите его), что, возможно, даст вам возможность отсоединить вашу сущность. Метод не может быть назван detach () -> для Hibernate это evict ().

...