在一个方法中调用persist()flush()和refresh()以正确的方式持久化实体吗?

时间:2011-08-26 15:16:24

标签: 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 - 对我来说听起来像“火与忘”。但我的客户端依赖于主键。我的方法有替代解决方案吗?这是我的最佳做法吗?你觉得怎么样?

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

传递给persist的实体是持久的。这意味着,在事务中现在或稍后,它将被写入数据库并为该实体生成ID。实例本身(您传递给persist的实例)将为其分配生成的ID。因此,只是持久化实体在大多数情况下是足够的,因为当客户端将调用getId()时,已经提交已调用persist的事务,这意味着该实体具有ID。

答案 2 :(得分:0)

如果使用eclipselink,您应该尝试

@ReturnInsert

注释。你用@Id设置它,你告诉Eclipselink从数据库中获取ID。