如果我有@Cascade(CascadeType.SAVE_UPDATE)一@OneToMany關係如下如何在我的Hibernate事務由Spring管理時啓用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()));
而且我打電話
sessionFactory.getCurrentSession().save(one);
之前
會根據Transitive persistence Hibernate參考文檔,你可以看到
如果父被save(),更新()或者saveOrUpdate(),所有兒童通過saveOrUpdate()
好的。現在,讓我們來看看Java持久性有了約saveOrUpdate方法Hibernate的書會談
休眠查詢多個表給定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列(不適用)
- 由Hibernate攔截器提供isTransient方法(選項我有)
這樣的一種方式來在使用這種級聯時,避免使用select-before-saving默認行爲,我通過將Hibernate攔截器分配給休眠會話來改進我的代碼,這些會話的事務由Spring管理。
這裏去我的倉庫
之前(沒有任何的Hibernate攔截):它工作正常!
@Repository
public class SomeEntityRepository extends AbstractRepository<SomeEntity, Integer> {
@Autowired
private SessionFactory sessionFactory;
@Override
public void add(SomeEntity instance) {
sessionFactory.getCurrentSession().save(instance);
}
}
後(使用Hibernate Inteceptor):不順心的事(不執行SQL查詢 - 既不是INSERT也不選擇先於儲蓄)
@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);
}
}
我的問題是:爲什麼春節不在使用Hibernate Interceptor時堅持我的實體及其關係,我應該如何解決這個問題?
如上所述:*您可以將一個攔截器添加到SessionFactory *中。它發生在我是否將一個攔截器添加到SessionFactory中,我將得到**全局**行爲。我只想添加一個攔截器到由add(SomeEntity實例)方法使用的Session實例。任何解決方法??? – 2010-06-22 05:00:41