1

removeGroupCoordinator()接受 2 个参数:用户名和组名。该方法将输入用户从输入组中移除。

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

有必要persist()在调用flush之前调用吗?我相信它不会因为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();
}
4

2 回答 2

2

这取决于groupEntity传入的实例的状态persist()。根据JPA 规范, 的语义persist(X)是:

  • 如果 X 是一个新实体,它就会成为托管实体。实体 X 将在事务提交时或之前或作为刷新操作的结果输入数据库。

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

  • 如果 X 是一个被移除的实体,它就会变成托管的。

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

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

所以,我想说 persist()只在以下情况下在您的代码中需要:

  1. groupEntity是刚刚被实例化的新实例new()
  2. groupEntity 有一些“持久的”级联关系,这些关系引用了一些刚刚由new()
于 2012-12-27T19:14:58.023 回答
1

调用 不是强制性的persist()。如果对象已经与 Hibernate 会话相关联,则对该对象的所有修改都将被保存。从手册修改持久对象

于 2012-12-27T15:53:29.023 回答