문제

특정 범주에 속하는 제품 객체가 있습니다.

@Entity
public class Product{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    String name;
    Double price;
    @ManyToOne(fetch = FetchType.LAZY)
    Category category;
...
}

@Entity
public class Category implements Identifiable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
...
}

사전 선택 범주없이 제품을 삽입하고 업데이트하고 싶습니다. 이와 같이:

Product product = dao.get(productId);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.update(product);

또는

Product product = new Product(somename);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.insert(product);

카테고리를 선택하지 않고 업데이트하고 삽입 할 수 있습니까? HQL이나 직접 쿼리를 사용하고 싶지 않습니다.

도움이 되었습니까?

해결책

session.load () 이와 같은 경우에 특별히 존재합니다. 다음과 같은:

Category category = session.load(categoryId);
product.setCategory(category);

데이터베이스에 도달하지 않습니다. 그러나 주어진 ID와 함께 사용할 수있는 카테고리가없는 경우 (플러시 중, 더 많은 경우) 이후 단계에서 예외가 발생합니다.

사용 load() 보다 빠릅니다 merge() 그리고 부작용이 없습니다 (계단식 등 ...)

다른 팁

최대 절전 모드는 객체의 상태를 결정하는 안전한 방법이 필요합니다. 그렇기 때문에 다른 세션에서 객체를 혼합 할 수 없도록 먼 길을 가고 있습니다 (따라서 시작시 카테고리를로드 할 수없고 나중에 사용할 수 없습니다).

해결책은 스타트 업에서 카테고리를로드하고와 같은 캐싱 제공 업체를 설정하는 것입니다. ehcache 이 클래스의 경우이 코드를 사용합니다.

Product product = new Product(somename);
product.setCategory(session.merge(category));

범주 인스턴스가 변경할 수없는 캐시를 구성하는 경우 DB 라운드 트립이 발생하지 않습니다.

방금 다음을 시도했습니다.

Category category = new Category(categoryId);
product.setCategory(category);

DB의 제품 레코드가 ID를 사용한 카테고리 및 카테고리에 대한 올바른 링크를 받았다는 것을 의미합니다.

categoryId

변경되지 않았습니다.

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