gpt4 book ai didi

jpa - EntityManager 何时提交?

转载 作者:行者123 更新时间:2023-12-05 00:02:31 30 4
gpt4 key购买 nike

我有以下服务...

@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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com