我对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角色中添加了一个角色;)
答案 0 :(得分:1)
因为您对托管对象所做的更改会被Hibernate自动保持为持久性。 Hibernate在其会话中保持对其托管对象的引用,并且在提交事务之前,它检查会话中的实体是否已被修改。如果已经存在,则执行适当的SQL查询以将更改写入数据库。
这也可以在提交事务之前发生:当您调用flush()或执行查询时(为了确保在执行查询之前修改了数据库)。
什么是管理实体?
user.getRoles()
中的关联,例如将如果用户也被管理,则返回托管实体)persist()
。请参阅http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#objectstate-overview
答案 1 :(得分:1)
检查你的角色类映射,看看在用户字段上是否有一些看似如下的设置:ManyToOne(cascade=CascadeType.XXX)
,如果是,则表示当你持久保存角色时,用户将通过休眠自动保留。