문제

나는이 간단한 상황을 가지고있다:

@Entity
public class Customer{

    @ManyToMany(fetch=FetchType.EAGER)
    @Cascade(CascadeType.SAVE_UPDATE)
    private List<Product> products=new ArrayList<Product>();

}

@Entity
public class Produtc{

    @ManyToOne
    @Cascade(CascadeType.SAVE_UPDATE)
    private Category category;
}

@Entity
public class Category{

    private String name;
}

새로운 고객을 삽입하는 루틴:

Customer customer=new Customer();
//customer.set data
Product p=dao.getProductBySomeUserInput...
if(p==null){
   p=new Product();
   //p.set data
}
customer.addProduct(p);
dao.save(customer);  //this row throw NonUniqueObjectException on Category class

이 문제를 어떻게 해결할 수 있습니까?이 문제는 캐스케이드 타입과 관련이 있다고 생각합니다.그러나 나는 그것을 필요로한다...모두 감사합니다.


업데이트

나는 문제를 발견했고 이것은 그것을 복제하는 방법입니다:

Customer c=new Customer();
// Load two products by id
Product p=dao.get(Product.class, 2);
Product p1=dao.get(Product.class, 3);
c.addProduct(p);
c.addProduct(p1);
// This try to update products, and category of products becouse CascadeType is SAVE_UDPATE
dao.save(c);

그래서,만약 피와 피 1 이 다른 카테고리를 가지고 있다면 프로브는 없지만,만약 피와 피 1 이 같은 카테고리를 가지고 있다면 나는 같은 카테고리가 세션에 있고 최대 절전 모드로 저장하려고 시도하기 때문에 카테고리에 대한 비 유니퀘이젝트 예외가 있습니다.

나는 캐스케이드 타입이 필요합니다.제품 및 카테고리 엔터티 모두에서 업데이트되므로 이 문제를 어떻게 해결할 수 있습니까?고마워

도움이 되었습니까?

해결책

이 문제는 아마도 잘못된 트랜잭션 관리 때문일 것입니다.모든 코드는 각 다오 호출에 대한 트랜잭션이 아닌 단일 트랜잭션에서 수행되어야합니다.서비스 계층은 트랜잭션을 구분하는 계층이어야하며 다오 계층이 아니어야합니다.

나는 최대 절전 모드가 무엇을 상상할 수 있습니다:

  1. 당신은 전화 dao.get(Product.class, 2).예를 들어 아이디 67 이 있는 카테고리를 가리키는 분리된 제품을 반환합니다.다오에 대한 호출이 끝날 때 트랜잭션이 종료되기 때문에 결과가 분리됩니다.
  2. 당신은 전화 dao.get(Product.class, 3).예를 들어 아이디 67 이 있는 카테고리를 가리키는 분리된 제품을 반환합니다.그러나 호출이 다른 트랜잭션에서 실행되기 때문에 두 번째 다른 카테고리 인스턴스를 얻습니다.
  3. 당신은 제품에 저장 업데이트 호출합니다.이것은 카테고리로 이어지고,최대 절전 모드는 카테고리 1 과 카테고리 2 를 세션에 연결해야 합니다.둘 다 같은 신분증을 가지고 있기 때문에,캐스케이드 중 하나는 수행되지 않을 수 있습니다.

단일 트랜잭션을 사용하여 두 제품을 모두 가져오는 경우 두 제품 모두 동일한 범주 인스턴스를 가지며 문제가 발생하지 않습니다.전화 merge 대신 saveOrUpdate 또한 작동해야합니다:최대 절전 모드는 두 범주의 상태를 첨부 된 세 번째 범주로 복사합니다.그러나 할 수있는 옳은 일은 다오에 두 호출을 포함하는 트랜잭션을 사용하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top