cla*_*net 6 persistence hibernate event-listener insert-update
我正在使用Hibernate 4.1尝试调用PreInsertEventListener来在将实体插入数据库之前更新实体,基于以下文章:http://anshuiitk.blogspot.ca/2010/11/hibernate-pre-database-opertaion-event html的
public class PreInsertListener implements PreInsertEventListener {
@Override
public boolean onPreInsert(PreInsertEvent event) {
Product product = (Product)event.getEntity();
String barcode = "B" + product.getProductId();
product.setBarcode(barcode);
// Update the state value that will be persisted
String[] properties = event.getPersister().getEntityMetamodel().getPropertyNames();
List<String> propertiesList = Arrays.asList(properties);
event.getState()[propertiesList.indexOf('barcode')] = barcode;
}
}
Run Code Online (Sandbox Code Playgroud)
当我调试它时,它正在执行PreInsertListener代码,但插入到数据库中的值不包含代码中的更改.这曾经在Hibernate 3中工作.我在这里缺少什么?
只要确保您没有陷入上面共享的博客文章中列出的方法3问题即可。如果您在一个事务中对实体执行插入和更新操作,则更新操作将覆盖您的preInsert侦听器操作。
-来自博客文章的消息(http://anshuiitk.blogspot.ca/2010/11/hibernate-pre-database-opertaion-event.html)
Hibernate生成一个准备好的语句,并从事件中存在的“状态”数组中填充参数。因此,对此“状态”数组所做的任何更改都会反映在由休眠生成的sql语句中,并最终反映在数据库中。插入和更新事件具有此状态数组的不同副本。
预插入侦听器在预更新事件之前被调用(如果同时发生插入和更新)。在同一事务中创建,持久保存然后修改实体时,会发生这种情况。在同一实体上,这将导致两个独立的sql语句,第一个将是insert语句,第二个将是update语句。使用INSERT语句,我们只设置insertUser和insertTime我们PreInsertEventListener不updateUser和updateTime。生成的语句看起来像
insert into entity (id, .... , insert_user, insert_time, update_user, update_time) values (1, .... 'test', '21.11.2010 16:10:00', null, null)
Run Code Online (Sandbox Code Playgroud)
与PreUpdateEventListener生成的更新SQL将像
update entity set id=1 .... , insert_user=null, insert_time=null, update_user='test', update_time='21.11.2010 16:10:00'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3364 次 |
| 最近记录: |