使用JPA和自动生成的主键标识将实体持久保存到数据库

时间:2011-11-14 18:15:48

标签: java java-ee jpa persistence jpql

我有一个带有表示层和数据库的完整Java EE Web应用程序。我正在使用带有glassfish 3.1和JPA的derby来处理持久性。我已经创建了一个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: 异常描述:使用JTA时无法使用EntityTransaction。“

如果您不知道此代码的问题是什么,但可以提供一个简单的使用自动生成的主键持久化的示例,这将同样有用。

这是我正在使用的读取方法:

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 个答案:

答案 0 :(得分:1)

您正在使用带有transaction-type="JTA"的EJB / JTA。然后容器将管理事务本身。您可以通过EJB类/方法上的@TransactionAttribute@TransactionAttributeType注释来控制事务(默认情况下不应该这样)。您阅读的教程显然没有使用EJB / JTA,而只使用transaction-type="RESOURCE_LOCAL"的应用程序管理事务。您应该阅读针对EJB / JTA使用的JPA教程。

解决您的问题 - 我假设您要继续使用EJB / JTA-,请替换

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

通过

em.persist(feed);

另见: