Сохранение объекта в базе данных с JPA и автоматически сгенерированным идентификатором первичного ключа - PullRequest
0 голосов
/ 14 ноября 2011

У меня полнофункциональное веб-приложение на Java EE с уровнем представления и базой данных.Я использую дерби со Glassfish 3.1 и JPA, чтобы справиться с настойчивостью.Я создал Read ok, но теперь у меня проблемы с созданием и сохранением в базе данных.Я думаю, что я близок, но что-то не так с тем, как я пытаюсь творить.

Вот мой код EAO:

/**

 * Session Bean implementation class XRSSeao

 */

@Stateless

@LocalBean

public class XRSSeao {



@PersistenceContext

EntityManager em;

public XRSSeao() {}




    public void addEvent(String update){

    Feed feed = new Feed();

    feed.setStatus(update);

    feed.setId(2);

        em.getTransaction().begin();

            em.persist(feed);

            em.flush();

            em.clear();

        em.getTransaction().commit();

}

}

Это будет вызвано из другого EJB.Я также не хочу устанавливать ID, так как это основной ключ, который я хочу генерировать всякий раз, когда я вызываю метод persist.Ошибка, которую я получаю при тестировании:

"Причина: java.lang.IllegalStateException: Exception Description: Невозможно использовать EntityTransaction при использовании JTA."

Если вы не знаетеВ чем проблема с этим кодом, но он может привести пример простого сохранения с автоматически сгенерированным первичным ключом, который был бы столь же полезным.

Это мой метод чтения, который работает:

public String lastUpdate(){
    String resultString;
    Query q = em.createQuery("SELECT x FROM Feed x WHERE x.id = 1");
    List<Feed> ListofStatus =  q.getResultList();  //alternatively you can use getResultList() for non 1 object is expected. 
    Feed returnStatusObject = ListofStatus.get(0);
    resultString = returnStatusObject.getStatus();
    return resultString;

}

Если мне не нужно использовать Transaction (), я не нашел пример в Интернетекоторый не использует его для создания.

1 Ответ

1 голос
/ 14 ноября 2011

Вы используете EJB / JTA с transaction-type="JTA".Контейнер сам будет управлять транзакциями.Вы можете управлять транзакциями с помощью аннотаций @TransactionAttribute и @TransactionAttributeType для класса / методов EJB (что по умолчанию, однако, не требуется).Учебники, которые вы читали, по-видимому, не использовали EJB / JTA, а просто управляли транзакциями приложений с transaction-type="RESOURCE_LOCAL".Вам следует прочитать учебные руководства по JPA, предназначенные для использования с EJB / JTA.

Чтобы устранить проблему - я предполагаю, что вы хотите продолжать использовать EJB / JTA-, замените

em.getTransaction().begin();
em.persist(feed);
em.flush();
em.clear();
em.getTransaction().commit();

на

em.persist(feed);

См. Также:

...