有必要调用persist()吗?

时间:2012-12-27 15:21:47

标签: hibernate

removeGroupCoordinator()有两个参数:用户名和&组名。该方法从输入组中删除输入用户。

重载removeGroupCoordinator(coordinators: Set<Long>, coordinatorIdToRemove: Long, groupId: Long)会通过最终调用coordinators.remove(coordinatorIdToRemove)从组中删除协调员。

在调用flush之前是否需要调用persist()?我相信不是因为flush()会将数据库同步到缓存,我将使用coordinators.removeCoordinator(...).

对其进行修改
public void removeGroupCoordinator(final long followerId, final long followingId)
{
    DomainGroup groupEntity = getDomainGroup();

    Set<Person> groupCoordinators = groupEntity.getCoordinators();

    removeGroupCoordinator(groupCoordinators, followerId, followingId);

    groupEntity.setCoordinators(groupCoordinators);

    // getEntityManager().persist(groupEntity); needed? 

    getEntityManager().flush();
}

2 个答案:

答案 0 :(得分:2)

这取决于传递给groupEntity的{​​{1}}个实例的状态。根据{{​​3}},persist()的语义是:

  
      
  • 如果X是新实体,则会被管理。实体X将在事务提交时或之前输入数据库,或者作为a   刷新操作的结果。

  •   
  • 如果X是预先存在的托管实体,则persist操作会忽略它。但是,持久化操作与实体级联   如果从X到这些其他实体的关系,则由X引用   使用cascade = PERSIST或cascade = ALL注释进行注释   元素值或使用等效的XML描述符元素指定。

  •   
  • 如果X是已删除的实体,则会被管理。

  •   
  • 如果X是一个分离的对象,则在调用持久化操作或EntityExistsException或者EntityExistsException时可能会抛出EntityExistsException。   在刷新或提交时可能会抛出另一个PersistenceException。

  •   
  • 对于来自X的关系引用的所有实体Y,如果与Y的关系已使用级联元素值注释   cascade = PERSIST或cascade = ALL,持久化操作应用于Y。

  •   

所以,我想在以下情况下只需要代码中persist(X)

  1. persist()是由groupEntity
  2. 实例化的新实例
  3. new()有一些“持久”级联关系,这些关系引用了一些仅由groupEntity实例化的实例

答案 1 :(得分:1)

调用persist()并非强制要求。如果该对象已与Hibernate会话关联,则将保存对该对象的每个修改。从手册Modifying persistent objects