JPA2中分离对象的问题

时间:2011-04-03 17:26:34

标签: hibernate spring jpa persistence jpa-2.0

我正在使用JPA2和Hibernate实现。我正在尝试保留一个User对象,它有一个权限列表

@OneToMany(mappedBy = "user", fetch = LAZY, cascade = ALL)
private List<UserAuthority> userAuthorities;

在我的服务中有:

UserAuthority userAuthority = new UserAuthority();
userAuthority.setAuthority(authorityDao.getByName(Authorities.ROLE_USER
                .toString()));
userAuthority.setUser(user);
List<UserAuthority> authorities = new ArrayList<UserAuthority>();
authorities.add(userAuthority);
user.setUserAuthorities(authorities);
userDao.persist(user);

"getByName"中的authorityDao方法在我的数据库中找到ROLE_USER。 userDao和authorityDao都获得了@Transactional注释。现在,当我尝试拨打userDao.persist(user)时,我得到了一个例外。为什么以及如何解决它?

org.springframework.orm.jpa.JpaSystemException: org.hibernate.PersistentObjectException: detached entity passed to persist: pl.flamewars.entity.Authority; nested exception is javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: pl.flamewars.entity.Authority

由于

的Dawid

2 个答案:

答案 0 :(得分:4)

这是使用事务dao方法(使用spring)产生的许多复杂情况之一。

通常的做法是使用@Transactional注释您的服务方法。

在您的情况下,您的Authority对象似乎是从其他会话中获取的,因此在您致电persist()时会将其分离。所以:

  • 在DAO方法上删除@Transactional并将其放在服务方法上
  • 尝试merge(..)(而不是persist()

答案 1 :(得分:0)

当你传递一些分离的实体来持久化时,通常会发生这种情况。

userAuthority.setAuthority(authorityDao.getByName(Authorities.ROLE_USER
                .toString()));

此代码实际加载持久化实体并设置为新userAuthority,而不是分配新的Authority对象或重新访问AuthorityUserAuthority的级联映射部分