Spring에서 관리하는 Hibernate Transaction을 가질 때 Hibernate Interceptor를 활성화하는 방법은 무엇입니까?
public class One {
private Integer id;
private List<Many> manyList = new ArrayList<Many>();
@Id
@GeneratedValue
public Integer getId() {
return this.id;
}
@OneToMany
@JoinColumn(name="ONE_ID", updateable=false, nullable=false)
@Cascade(CascadeType.SAVE_UPDATE)
public List<Many> getManyList() {
return this.manyList;
}
}
그리고 많은 클래스
public class Many {
private Integer id;
/**
* required no-arg constructor
*/
public Many() {}
public Many(Integer uniqueId) {
this.id = uniqueId
}
/**
* Without @GeneratedValue annotation
* Hibernate will use assigned Strategy
*/
@Id
public Integer getId() {
return this.id;
}
}
나는 다음과 같은 시나리오가있는 경우
One one = new One();
/**
* generateUniqueId method will Take care of assigning unique id for each Many instance
*/
one.getManyList().add(new Many(generateUniqueId()));
one.getManyList().add(new Many(generateUniqueId()));
one.getManyList().add(new Many(generateUniqueId()));
one.getManyList().add(new Many(generateUniqueId()));
그리고 다음과 같이 내가 @Cascade (CascadeType.SAVE_UPDATE)과 @OneToMany 관계가있는 경우 전화 :
sessionFactory.getCurrentSession().save(one);
부모
()가, update() 또는 saveOrUpdate(),
모든 어린이 저장 전달되면
에 가기 전에 Transitive persistence Hibernate 참조 문서에 따르면, 당신은
를 볼 수 있습니다 saveOrUpdate()에 전달됩니다.
ok. 이제이 될 saveOrUpdate 방법에 대한 최대 절전 책 회담으로 자바 지속성
최대 절전 모드 이 지정된 ID의 많은 테이블을 쿼리 것을 보자, 그리고 을가를 발견하는 경우, 은 행을 업데이트 최대 절전 모드. 찾을 수없는 경우, 새 행을 삽입하면이 필요하고 완료됩니다.
INSERT INTO ONE (ID) VALUES (?)
/**
* I have four Many instances added To One instance
* So four select-before-saving
*
* I DO NOT NEED select-before-saving
* Because i know i have a Fresh Transient instance
*/
SELECT * FROM MANY WHERE MANY.ID = ?
SELECT * FROM MANY WHERE MANY.ID = ?
SELECT * FROM MANY WHERE MANY.ID = ?
SELECT * FROM MANY WHERE MANY.ID = ?
INSERT INTO MANY (ID, ONE_ID) VALUES (?, ?)
INSERT INTO MANY (ID, ONE_ID) VALUES (?, ?)
INSERT INTO MANY (ID, ONE_ID) VALUES (?, ?)
INSERT INTO MANY (ID, ONE_ID) VALUES (?, ?)
선택-전에 절약되는 것을 방지하기 위해 해결 방법에 따라 번역 될 수
??? 예, 당신도
- 는 방법 에로 (내가이 옵션 ) 그래서
를 (적용되지 않음) @Version 열
여기에 (어떤 최대 절전 모드 인터셉터없이) 내 저장소 전에
간다 : 그것은 잘 작동!봄하지 않는 이유 : -
@Repository
public class SomeEntityRepository extends AbstractRepository<SomeEntity, Integer> {
@Autowired
private SessionFactory sessionFactory;
@Override
public void add(SomeEntity instance) {
sessionFactory.openSession(new EmptyInterceptor() {
/**
* To avoid select-before-saving
*/
@Override
public Boolean isTransient(Object o) {
return true;
}
}).save(instance);
}
}
내 질문은 뭔가 잘못 (어느 쪽도 절전을 선택-전에 삽입 아니다 없음 SQL 쿼리가 실행되지 않습니다) : (최대 절전 모드 Inteceptor이와 함께)이 후
@Repository
public class SomeEntityRepository extends AbstractRepository<SomeEntity, Integer> {
@Autowired
private SessionFactory sessionFactory;
@Override
public void add(SomeEntity instance) {
sessionFactory.getCurrentSession().save(instance);
}
}
최대 절전 모드 인터셉터를 사용할 때 내 개체와 그 관계를 유지하고 잘 작동하려면 해결 방법으로 무엇을해야합니까 ???
설명 : * SessionFactory *에 인터셉터를 추가 할 수 있습니다. Interceptor를 SessionFactory에 추가했는지 여부에 관계없이 ** 전역 ** 동작이 발생합니다. add (SomeEntity 인스턴스) 메소드에서 사용되는 Session 인스턴스에 인터셉터를 추가하기 만하면됩니다. 모든 해결 방법 ??? –