jpa - EntityManager 何时提交?

标签 jpa jersey ejb-3.1 entitymanager

我有以下服务...

@Stateless
@LocalBean
public class RandomService {

    @EJB RandomString stringTokenizer;

    @PersistenceContext
    EntityManager em;

    public String generate(Actions action)
    {
        Token token = new Token();
        token.setAction(action);
        token.setExpiry(new Date());
        token.setToken(stringTokenizer.randomize());

        em.persist(token);
        //em.flush();

        return String.format("%010d", token.getId()) + token.getToken();
    }
}

如果我不把 em.flush() 那么行 token.getId() 将返回 null(使用 DB GENERATED SEQUENCE),尽管我知道我是否将 Token 而不是 string 返回到调用服务的 id 设置。因此,当服务返回 token 对象时,EM 似乎会刷新,但在我放置 String.txt 时不会刷新。通过放置flush,我得到了我需要的东西,对吗?

最佳答案

不要将刷新与提交混淆。期间flush() JPA 提供程序以物理方式将生成的 SQL 发送到数据库,在您的情况下,读取生成的 ID 并将其填充到 bean 中。请注意,您应该始终使用返回的实体,而不是传递给 persist() 的原始实体。 :

token = em.persist(token);

另一方面,提交执行数据库提交。显然会触发flush()首先,但它不会帮助你在这里。但是既然你在问 - EJB 中的每个方法默认都是事务性的。这意味着当您将第一个 EJB 留在堆栈上时提交事务:如果您从另一个 EJB 调用一个 EJB,则被调用者默认加入调用者事务(请参阅:事务传播行为)。

还要注意规则何时到flush()有点复杂,因为每个提供商都试图尽可能晚地分批执行此操作。

关于jpa - EntityManager 何时提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904894/

相关文章:

java - 在一个字段上使用最大条件连接表

java - Hibernate - 更新/选择后的结果相同

java - 带有 jerseyServlets 的嵌入式 Jetty 中的错误 "Multiple servlets map to path:/*: "

spring - 使用 Spring-Security DB 登录的 Jersey 不断重定向到登录页面

hibernate - EntityManager.persist()方法挂起

java - 如何使用继承处理 JPA CollectionTable?

java - 使用 JPA2 设置 TypedQuery 的超时

java - Jersey 2 和 HK2 : any way to force a class reload for every request?

web-services - EJB3 远程 vs Web 服务,性能如何?

java - EJBCLIENT000409 : No more destinations are available