【问题标题】:hibernate persistence of an element in a collection集合中元素的休眠持久性
【发布时间】:2014-08-22 18:16:04
【问题描述】:

我有一个关于休眠中对象的持久性的问题。

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

@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(使用persist),而我不需要更新用户,例如(em.merge(u));虽然我已经修改了用户(在其 Collection 角色中添加了一个角色;)

【问题讨论】:

    标签: hibernate


    【解决方案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

    【讨论】:

      【解决方案2】:

      检查你的角色类映射,看看用户字段是否有一些设置,看起来像:ManyToOne(cascade=CascadeType.XXX),如果有,这意味着当你持久化角色时,用户将通过休眠自动持久化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2010-10-29
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        相关资源
        最近更新 更多