обновить с помощью JPA - PullRequest
1 голос
/ 15 февраля 2010

Я использую Glassfish v2 и постоянство в веб-приложении.

Я вызываю постоянные коды, используя обычный файл классов Java внутри веб-приложения

Я могу легко выбрать, используя этот код: -

   @PersistenceUnit
public EntityManagerFactory emf;
EntityManager em;


public List fname (String id) {
    String fname = null;
    List persons = null;
    //private PersistenceManagerFactory persistenceManagerFactory;

    try {
        emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");

        em = emf.createEntityManager();
        persons = em.createQuery("select r from Roleuser r").getResultList();

        int i=0;
        for (i=0;i<persons.size(); i++)
            System.out.println("Testing n "+ i +" " + persons.get(i));

    } catch(Exception e) {
        System.out.println("" + e);
    }
    finally {
        if(em != null) {
            em.close();
        }
    }
    return persons;
}

Я хочу обновить с помощью JTA, поскольку файл persistence.xml имеет Сделка типа = «ССТ»

Когда я пытаюсь использовать обновление с использованием этого кода, я получаю исключение nullPointerException без каких-либо следов в журнале

     @PersistenceUnit
public EntityManagerFactory emf;
EntityManager em;
Context context;
@Resource
private UserTransaction utx;

public List fname (String id) {

    String fname = null;
    List persons = null;


    try {
        emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");

        utx.begin();
        em = emf.createEntityManager();

        int m = em.createQuery("update Roleuser r set r.firstName = 'Jignesh I' where r.userID=9").executeUpdate();

        utx.commit();


    } catch(Exception e) {
        System.out.println("" + e);
    }
    finally {
        if(em != null) {
            em.close();
        }
    }
    return persons;
}

Любая помощь

Спасибо

Pradyut

Ответы [ 3 ]

1 голос
/ 15 февраля 2010

ну код должен быть без каких-либо кошмаров ... (по крайней мере для меня в Glassfish)
с постоянством.xml, имеющим

<persistence-unit name="WebApplicationSecurityPU" transaction-type="RESOURCE_LOCAL">

код

@PersistenceUnit
public EntityManagerFactory emf;
public EntityManager em;




public EntityManager getEm() {
    emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");
    em = emf.createEntityManager();
    return em;
}

public List fname (String id) {

    String fname = null;
    List persons = null;


    try {
        System.out.println("test");

        em = this.getEm();


        em.getTransaction().begin();
        int m = em.createQuery("update Roleuser r set r.firstName = 'Jignesh H' where r.userID=9").executeUpdate();

        em.getTransaction().commit();


    } catch(Exception e) {
        System.out.println("" + e);
    }
    finally {
        if(em != null) {
            em.close();
        }
    }
    return persons;
}

Любые улучшения приветствуются ... (на самом деле нужны ...) (Как использовать @PersistenceContext)

Спасибо

Pradyut

0 голосов
/ 15 февраля 2010

Ваш "обычный" класс, скорее всего, не является управляемым компонентом , т. Е. Классом, жизненный цикл которого управляется контейнером (например, сервлетами, фильтрами сервлетов, обработчиками тегов JSP, управляемыми компонентами JSF, ... ) и не может извлечь выгоду из внедрения ресурса 1 . Таким образом, ни UserTransaction, ни EntityManagerFactory не вводятся здесь, следовательно, NullPointerException.

Честно говоря, вы должны попытаться использовать контейнер, управляемый EntityManager, это сделает ваш код менее грязным. Если вы не можете ввести его, получите его с помощью поиска JNDI. См. Ресурс ниже.

1 Посмотрите на Веб-уровень для работы с Java EE 5: Посмотрите на внедрение ресурсов , чтобы получить хороший обзор того, что можно внедрить и где.

Ресурсы

Ссылки

  • спецификация JPA 1.0
    • Раздел 5.2 «Получение Entity Manager»
    • Раздел 5.6 "Контексты управляемости контейнером"
0 голосов
/ 15 февраля 2010
  1. Возможно, ваш бин не управляется - то есть он не является частью какого-либо контекста (весна, EJB). Как вы создаете свой объект?
  2. Вы действительно не должны звонить createEntityManager() - введите один, используя @PersistenceContext
  3. Вы должны быть абсолютно уверены, что вам нужен JTA перед использованием.
  4. Похоже, вы используете PersistenceUnit, но затем переназначьте etm - я бы предложил сбросить оба и увидеть p2 выше.

Если вы вообще не используете инъекцию зависимостей, отбросьте все аннотации, сохраните текущий код и введите:

em.getTransaction().begin();
...
em.getTransaction().commit();

(и определите RESOURCE_LOCAL в своем файле persistence.xml. JTA вам действительно не нужен)

...