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