hibernate集合中元素的持久性

时间:2014-08-22 10:03:42

标签: hibernate

我对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;

}

我想在DaoImpl中为用户添加另一个角色

 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);

   }
 }

我想说明为什么我只需要保存角色r(带有持久性),我不需要更新用户例如(em.merge(u));虽然我修改了用户(在其Collection角色中添加了一个角色;)

2 个答案:

答案 0 :(得分:1)

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

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

什么是管理实体?

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

请参阅http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#objectstate-overview

答案 1 :(得分:1)

检查你的角色类映射,看看在用户字段上是否有一些看似如下的设置:ManyToOne(cascade=CascadeType.XXX),如果是,则表示当你持久保存角色时,用户将通过休眠自动保留。