jpa - 是否在一种方法中调用 persist()、flush() 和 refresh() 以正确的方式持久化实体?

标签 jpa persistence

我的目的是在同一个业务调用中向客户端返回一个新持久化的实体,以获得进一步业务逻辑所需的生成的主键。再次调用 finder 方法以按名称或某些已知属性查找实体将导致我想避免的第二次服务器往返(时间就是金钱;-)。所以我创建了以下方法:

public Entity persist(Entity entity) {
    em.persist(entity);
    em.flush();
    em.refresh(entity);
    // now the entity has an id
    return entity;
}

但现在我想知道这是否是正确的方法。不知怎的,感觉很“奇怪”。 JPA 规范对此非常清楚:EntityManager 的 persist() 方法返回 void - 对我来说听起来像是“一劳永逸”。但是我的客户依赖于主键。我的上述方法是否有替代解决方案?在我的情况下这是最佳实践吗?你怎么认为?

最佳答案

没有单一的“正确方法”……否则就是 API。您可以调用适合您的应用程序的方法以及该方法的用例。如果之后立即需要数据存储中的对象,则调用flush(),否则不需要。如果您有其他可以更新内容的进程,那么您调用 refresh() 否则您不会。等等。

关于jpa - 是否在一种方法中调用 persist()、flush() 和 refresh() 以正确的方式持久化实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7206891/

相关文章:

java - JPA 组合键 @OneToMany

java - 交易在 Jetty 中不及时持久化

tomcat - 使用 EclipseLink 配置连接池

arrays - 如何使用 NSUserDefaults 存储字典数组

java - 由于在 @Transactional 方法中使用带有 Hibernate、Spring 和 CrudRepository 接口(interface)的 JPA 关闭 session 导致延迟加载异常

java - JPA PreUpdate 使用在 find/select 之后调用的 DescriptorEventAdapter 实现

java - Hibernate 组合实体

java - spring.jpa.properties.hibernate.jdbc.time_zone 适用于写入但不适用于读取?

persistence - 岩浆、商品、GLORP 或其他什么?

java - 使用 like 语句对 javax 持久性命名查询进行澄清