카테고리 없음

이미 지속 된 엔티티를 지속 할 때 예외가 표시됩니까?

기록만이살길 2021. 2. 19. 17:02
반응형

이미 지속 된 엔티티를 지속 할 때 예외가 표시됩니까?

1. 질문(문제점):

2 개의 엔티티 UserUserPayment있습니다. , . UserUserPaymentOneToMany관계를. 에 변수 setDefaultUserPayment있습니다. 때 새로운 UserPayment자사가 setDefault설정해야합니다 true및 다른 UserPayment특정의 User로 설정해야합니다 false. new UserPayment가 생성 된 지속되면 아래 오류가 발생합니다.

엔티티 사용자

@Entity
public class User  {
        
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id",nullable = false,updatable = false)
    private Long id;

    @OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
    private List<UserPayment> userPaymentList;
        
}

엔티티 사용자 지불

@Entity
public class UserPayment{
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private boolean defaultPayment;
    
    @ManyToOne
    @JoinColumn(name="user_id")
    @JsonIgnore
    private User user;

}

제어 장치

@RequestMapping(value = "/add",method = RequestMethod.POST)
public ResponseEntity addNewCardDetail(@RequestBody UserPayment userPayment,Principal principal) {  
    if(principal != null) {
        String username = principal.getName();
        User user = userServiceImpl.findUserByUsername(username);
        userServiceImpl.uodateUserBilling(user,userPayment);
        return new ResponseEntity("Your card has been successfully saved",HttpStatus.OK);
    }
    return new ResponseEntity("Card not saved",HttpStatus.BAD_REQUEST);
}

서비스 구현

@Override
public void uodateUserBilling(User user, UserPayment userPayment) {
    userPayment.setDefaultPayment(true);
    userPayment.setUser(user);
    List<UserPayment> paymentList = user.getUserPaymentList();
    for(UserPayment eachPaymnet:paymentList) {
        eachPaymnet.setDefaultPayment(false);
        paymentRepository.save(eachPaymnet);
    }    
    user.getUserPaymentList().add(userPayment);
    userRepository.save(user); 
    
}

오류

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Multiple representations of the same entity [com.bookstore.domain.UserPayment#53] are being merged. Detached: [com.bookstore.domain.UserPayment@6ea664ae]; Managed: [com.bookstore.domain.UserPayment@790e8792]; nested exception is java.lang.IllegalStateException: Multiple representations of the same entity [com.bookstore.domain.UserPayment#53] are being merged. Detached: [com.bookstore.domain.UserPayment@6ea664ae]; Managed: [com.bookstore.domain.UserPayment@790e8792]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)

2. 해결방안:

오류가 발생되어 uodateUserBilling()이미 지속되면 지속하기 때문에, UserPayment다시 목록에 추가 user.getUserPaymentList().add(userPayment);.Add UserPayment의 새 항목 다른 그나마 코드 아래 해보는를 추가하는 경우에만 목록에

    public void updateUserPayment(User user, UserPayment userPayment) {
    userPayment.setUser(user);
    List<UserPayment> paymentList = user.getUserPaymentList();
  
    if(userPayment.getId() != null ) {
        paymentRepository.save(userPayment);
    }
    else{
        userPayment.setDefaultPayment(true);
        for(UserPayment eachPaymnet:paymentList) {
                eachPaymnet.setDefaultPayment(false);
        }    
        user.getUserPaymentList().add(userPayment);
        userRepository.save(user);
    }
    
}
65873260
반응형