gpt4 book ai didi

hibernate - 如何确定 Hibernate PostUpdateEventListener 中的集合更改?

转载 作者:行者123 更新时间:2023-12-04 23:11:09 25 4
gpt4 key购买 nike

在 Hibernate 中,实现一个 PostUpdateEventListener 允许您插入 Hibernate 的工作流程,并让您有机会在保存时检查和比较实体属性的旧值和新值( PostUpdateEvent 具有方法 getOldState() getState() 返回这些值的数组)。对于标准属性,这很好用。但是,如果这些属性之一是内容已更改的集合,则这无济于事:“旧值”和“新值”都只是对集合的相同引用(因为集合本身没有改变,只是其内容)。这意味着您只能看到该集合的最新内容,即"new"内容。

任何人都知道是否有办法确定实体拥有的集合的元素在工作流中的这一点发生了怎样的变化?

最佳答案

我想出了一个方法来做到这一点,所以我会发布它以防其他人使用它。此代码循环遍历所有“旧状态”属性,对于任何持久集合,获取之前的内容“快照”。然后将其包装在一个不可修改的集合中以进行良好的衡量:

public void onPostUpdate( PostUpdateEvent event )
{
for ( Object item: event.getOldState() )
{
Object previousContents = null;

if ( item != null && item instanceof PersistentCollection )
{
PersistentCollection pc = (PersistentCollection) item;
PersistenceContext context = session.getPersistenceContext();
CollectionEntry entry = context.getCollectionEntry( pc );
Object snapshot = entry.getSnapshot();

if ( snapshot == null )
continue;

if ( pc instanceof List )
{
previousContents = Collections.unmodifiableList( (List) snapshot );
}
else if ( pc instanceof Map )
{
previousContents = Collections.unmodifiableMap( (Map) snapshot );
}
else if ( pc instanceof Set )
{
//Set snapshot is actually stored as a Map
Map snapshotMap = (Map) snapshot;
previousContents = Collections.unmodifiableSet( new HashSet( snapshotMap.values() ) );
}
else
previousContents = pc;

//Do something with previousContents here
}

关于hibernate - 如何确定 Hibernate PostUpdateEventListener 中的集合更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812364/

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