Невозможно удалить объект (JPA & Spring) - PullRequest
0 голосов
/ 18 марта 2011

Что бы я ни пытался, я не могу удалить сущность пользователя, когда вызываю delete () из своего класса userService.Я получаю исключение java.lang.IllegalArgumentException: Сущность должна быть в состоянии вызвать remove: com.blackbox.genesis.entities.User@30168a, попробуйте объединить отдельное и попробуйте снова удалить.Я явно делаю что-то не так - несмотря на слияние, но я не вижу, что.Все остальное работает нормально - я могу без проблем создавать и обновлять пользовательские объекты.

С уважением

Мой класс сущностей;

@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = "EMAIL")})
public class User implements Serializable {


@Id
@Column(name="username", length=50)
private String username;
@OneToOne(cascade = {CascadeType.ALL})
private Password password;
private boolean enabled;
private int serial;
private String email;
@Version
private int version;

@ElementCollection(targetClass=Authority.class)
@CollectionTable(name="USER_AUTHORITY")
private List<Authority> authorities;

@OneToMany(mappedBy="user", fetch=FetchType.LAZY, cascade=CascadeType.ALL, ``orphanRemoval=true)
private Set<License> licenses;

private static final long serialVersionUID = 1L;

public User() {
    super();
    this.authorities = new ArrayList<Authority>();
} 
.... getters/setters.

Мой класс DAO;

@Repository
public class UserJpaController {

@PersistenceContext
EntityManager em;

protected static final Logger logger =   Logger.getLogger("com.blackbox.genesisng.entities.UsersJpaController");

public void create(User user) throws PreexistingEntityException, Exception {



    if (findUser(user.getUsername()) != null) {
        throw new PreexistingEntityException("Users " + user + " already exists.");
    }

      em.persist(user);
      em.flush();


}

public void edit(User user) throws NonexistentEntityException, Exception {

        user = em.merge(user);
        em.flush();
}


public void destroy(String id) throws NonexistentEntityException {
        User user = em.find(User.class, id);
        user = em.merge(user);
        em.remove(user);


}

public List<User> findUserEntities() {
    return findUserEntities(true, -1, -1);
}

public List<User> findUserEntities(int maxResults, int firstResult) {
    return findUserEntities(false, maxResults, firstResult);
}

private List<User> findUserEntities(boolean all, int maxResults, int firstResult) {
        Query q = em.createQuery("select object(o) from User as o");
        if (!all) {
            q.setMaxResults(maxResults);
            q.setFirstResult(firstResult);
        }
        return q.getResultList();

}

public User findUser(String id) {
        return em.find(User.class, id);

}

public int getUserCount() {
        Query q = em.createQuery("select count(o) from User as o");
        return ((Long) q.getSingleResult()).intValue();

}

public User findUserByEmail(String email) {

        Query q = em.createQuery("select Object(o) from User as o where              o.email          =     :email");
        q.setParameter("email", email);
        List list = q.getResultList();
        if (list.size() == 0) {
            return null;
        }
        return (User) list.get(0);


}

public boolean exists(String id) {

    try {
         em.getReference(User.class,id);  
         return true;
         } 
         catch (EntityNotFoundException e) {
             return false;
         }


}



}

и, наконец, соответствующая часть моего класса обслуживания

@Service
public class UserService  {

@Autowired
UserJpaController dao;

@Autowired
LicenseJpaController licenseDao;

        @Transactional
public void delete(UserDTO userDTO) {
    if (exists(userDTO.getUserName())){
        try {
        dao.destroy(userDTO.getUserName());
        } catch (NonexistentEntityException e) {
            // ignore as the previous test should prevent this.
        }

    }

}

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Извините, но я идиот!Я не звонил в сервисный класс, как мне казалось.Исправлено, и все работает как положено.Еще раз, извините, ребята.

С уважением

0 голосов
/ 18 марта 2011

Удалите оператор

user = em.merge(user);

в вашем методе уничтожения DAO.Я не уверен, что это вызывает тестирование, но это не нужно, потому что пользователь загружен в оператор раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...