作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
在 Hibernate 中,实现一个 PostUpdateEventListener 允许您插入 Hibernate 的工作流程,并让您有机会在保存时检查和比较实体属性的旧值和新值( PostUpda
我是一名优秀的程序员,十分优秀!