2011-03-18 2 views
0

내 userService 클래스에서 delete()를 호출하면 사용자 엔티티를 삭제할 수 없습니다. 예외가 발생했습니다. java.lang.IllegalArgumentException : 엔티티는 remove : [email protected]를 호출하여 분리 된 것을 병합하고 제거를 다시 시도해야합니다. 나는 분명히 뭔가 잘못하고있다. 합병에도 불구하고, 나는 무엇을 볼 수 없다. 다른 모든 것은 잘 작동합니다. 문제없이 사용자 엔티티를 만들고 업데이트 할 수 있습니다.엔티티 (JPA 및 Spring)를 삭제할 수 없습니다.

감사합니다.

내 엔티티 클래스.

@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. 
     } 

    } 

} 

답변

0

미안하지만 나는 바보 야! 나는 내가 생각했던 서비스 수업을 부르지 않았다. 모든 것을 예상대로 수정했습니다. 다시 한번, 미안 해요.

감사합니다.

0

이 방법을 파괴하여 DAO의

user = em.merge(user);

문을 제거 내 서비스 클래스의 관련 부분. 내가 probem을 일으키는 지 확신 할 수는 없지만 사용자가 이전에이 명령문에로드 되었기 때문에 필요하지 않습니다.