Hibernate 休眠集合中元素的持久性

Hibernate 休眠集合中元素的持久性,hibernate,Hibernate,我有一个关于hibernate中对象的持久性的问题 上下文是我有一个具有多个角色的用户: @Entity @Table(name="users") public class User implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="user_id") private Long idUser; @OneToMany @J

我有一个关于hibernate中对象的持久性的问题

上下文是我有一个具有多个角色的用户:

@Entity
@Table(name="users")
public class User implements Serializable {

   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @Column(name="user_id")
   private Long idUser;

   @OneToMany
   @JoinColumn(name="user_id")
   private Collection<Role> roles;

}

我想了解为什么我只需要保存角色r(使用persist),而不需要更新用户,例如(em.merge(u));尽管我已经修改了用户(在其集合角色中添加了一个角色;)

,因为您对托管对象所做的更改会被Hibernate自动持久化。Hibernate在其会话中保留对其托管对象的引用,并在提交事务之前检查会话中的实体是否已被修改。如果它们已被删除,那么它将执行适当的SQL查询以将更改写入数据库

这也可能发生在事务提交之前:调用flush()或执行查询时(以确保在执行查询之前修改数据库)

什么是托管实体

  • 从Hibernate获取的任何实体:通过执行返回实体的查询、调用find()或getReference()或merge()、或通过浏览来自其他托管实体的关联(
    user.getRoles()
    例如,如果用户也被托管,则将返回托管实体)
  • 传递给
    persist()
    的任何实体

请参见

检查您的角色类映射,查看用户字段上是否有如下设置:
manytone(cascade=CascadeType.XXX)
,如果是,则表示当您保留角色时,用户将通过休眠自动保留

 public class ShopDaoImpl implements ShopDAO{

   @PersistenceContext
   private EntityManager em;

   @Override
   public void attribuerRole(Role r, Long userID) {
      User u = em.find(User.class, userID);
      u.getRoles().add(r);
      em.persist(r);

   }
 }