Проблема с Отдельным объектом в JPA2 - PullRequest
2 голосов
/ 03 апреля 2011

Я использую 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, и AuthorDao получили аннотации @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

Спасибо

Давид

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Это одно из многих осложнений, возникающих при использовании транзакционных методов дао (с пружиной).

Обычная практика заключается в том, чтобы помечать ваши методы обслуживания с помощью @Transactional.

В вашем случае ваш Authority объект, кажется, получен из другого сеанса, и, следовательно, он отключается, когда вы вызываете persist(). Итак:

  • Избавьтесь от @Transactional в методах DAO и поместите его вместо методов обслуживания
  • Дайте merge(..) попытку (вместо persist())
0 голосов
/ 03 апреля 2011

Обычно это происходит, когда вы передаете какой-то отдельному объекту персистентность.

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

Этот код фактически загружает постоянную сущность и устанавливает новый userAuthority, вместо этого присваивая новый объект Authority или возвращаясь к части каскадного отображения Authority в UserAuthority

...