gpt4 book ai didi

hibernate - 使用 Hibernate PreInsertEventListener 更改实体

转载 作者:行者123 更新时间:2023-12-04 15:00:28 27 4
gpt4 key购买 nike

我正在使用 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;
}
}

当我调试它时,它正在执行 PreInsertListener 代码,但插入到数据库中的值不包含代码中的更改。这曾经在 Hibernate 3 中工作。我在这里错过了什么?

最佳答案

只要确保您没有陷入上面分享的博客文章中列出的方法 3 问题。如果您在单个事务中对实体进行了插入和更新操作,那么您的 preInsert 监听器操作将被更新操作覆盖。

-- 来自博文的消息 ( http://anshuiitk.blogspot.ca/2010/11/hibernate-pre-database-opertaion-event.html )

Hibernate 生成一个准备好的语句并填充事件中存在的“状态”数组中的参数。因此,对此“状态”数组所做的任何更改都会反射(reflect)在由 hibernate 生成的 sql 语句中,并最终反射(reflect)在数据库上。插入和更新事件具有此状态数组的不同副本。

预插入监听器在预更新事件之前调用(如果发生插入和更新)。当在同一事务中创建、持久化和修改实体时,就会发生这种情况。这将导致两个单独的 sql 语句,第一个是插入语句,第二个是更新语句,在同一个实体上。使用插入语句,我们只设置了 insertUserinsertTime在我们的 PreInsertEventListener而不是 updateUserupdateTime .生成的语句看起来像

insert into entity (id, .... , insert_user, insert_time, update_user, update_time) values (1, .... 'test', '21.11.2010 16:10:00', null, null)

PreUpdateEventListener生成的更新 SQL 将类似于
update entity set id=1 .... , insert_user=null, insert_time=null, update_user='test', update_time='21.11.2010 16:10:00'

关于hibernate - 使用 Hibernate PreInsertEventListener 更改实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595727/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com