如果我有@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