我正在使用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
答案 0 :(得分:4)
这是使用事务dao方法(使用spring)产生的许多复杂情况之一。
通常的做法是使用@Transactional
注释您的服务方法。
在您的情况下,您的Authority
对象似乎是从其他会话中获取的,因此在您致电persist()
时会将其分离。所以:
@Transactional
并将其放在服务方法上merge(..)
(而不是persist()
)答案 1 :(得分:0)
当你传递一些分离的实体来持久化时,通常会发生这种情况。
userAuthority.setAuthority(authorityDao.getByName(Authorities.ROLE_USER
.toString()));
此代码实际加载持久化实体并设置为新userAuthority
,而不是分配新的Authority对象或重新访问Authority
中UserAuthority
的级联映射部分