선택없이 최대 절전 모드, 삽입 또는 업데이트
문제
특정 범주에 속하는 제품 객체가 있습니다.
@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
변경되지 않았습니다.
제휴하지 않습니다 StackOverflow