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

标签 java jakarta-ee jpa persistence jpql

我有一个完整的 Java EE Web 应用程序,带有表示层和数据库。我使用 derby 与 glassfish 3.1 和 JPA 来处理持久性。我已经创建了一个读取,但现在我在创建并保存到数据库时遇到了麻烦。我想我已经很接近了,但我尝试创作的方式有些不对劲。

这是我的 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(),我还没有在网上找到不使用它进行创建的示例。

最佳答案

您正在将 EJB/JTA 与 transaction-type="JTA" 一起使用。然后容器将自行管理事务。您可以通过@TransactionAttribute控制交易和 @TransactionAttributeType EJB 类/方法上的注释(默认情况下,但不是必需的)。您阅读的教程显然没有使用 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);

另请参阅:

关于java - 使用 JPA 和自动生成的主键标识将实体持久保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126129/

相关文章:

java - Ant 类互相寻找

java - 一个用户的多个 session ?

java - 2 个实体可以同时拥有 2 个关系吗? (日新社)

java - 如何配置 SonarQube 5.3 来调整使用哪些子模块/包来确定覆盖范围?

java - JGoodies 绑定(bind)与 JSR 295

jakarta-ee - Struts 1.1 对象 ArrayList 上的逻辑迭代器

java - 无状态和有状态 bean 区别的 EJB 示例

java - JPA - 跨 EntityManager 获取更新/同步的实体(刷新)

google-app-engine - 独特的约束——谷歌应用引擎

java - 使用 Java BigDecimal 表示 15 精度数字(小数位数为 2)