添加到集合时不会触发PreUpdate

我有一个JPA注释类,其中包含如下集合:

@Entity public class Employee { @Id private int id; @Basic private String name; @OneToMany @JoinTable(name = "ORG", joinColumns = @JoinColumn(name="MINION"), inverseJoinColumns = @JoinColumn(name="EMP")) private List minions = new ArrayList(); @PreUpdate public void preUpdate(){ ... } } 

我所看到的是,如果我有一个托管的Employee实体,并且我添加了它的preUpdate集合,则不会调用preUpdate方法。 在DB中的映射表中添加了一个新行,因此我知道更新正在进行中。 如果我直接在Employee上更改属性(如name),则preUpdate会在提交事务时按预期触发。

有没有办法在修改映射集合时触发PreUpdate? 或者是否有其他技术或Hibernate特定注释用于检测何时发生?

在为相关实体执行数据库UPDATE操作之前触发@PreUpdate事件。

如果您没有更新Employee直接属性,则不会为其表执行UPDATE ,因此永远不会调用@PreUpdate侦听器。 你应该有更好的运气使用@PrePersist事件,这是由“刷新”而不是“更新”触发的。

也许这个自定义解决方法有效:

创建ArrayList的子类,通过ActionListener模式标识更改

 public class Employee { .... private List minions = createChangeNotifierList(); private List createChangeNotifierList() { ChangeNotifierList l = new ChangeNotifierList(); l.setActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { preUpdate(); } }); return l; } public void setMinions(List l) { if (!(l instanceof ChangeNotifierList)) { l = createChangeNotifierList(); preUpdate(); } this.minions = l; } public void preUpdate(){ ... } } public class ChangeNotifierList extends ArrayList { private ActionListener actionListener; public ChangeNotifierList() { } public ChangeNotifierList(List list) { super.addAll(list); } public void setActionListener(ActionListener actionListener) { this.actionListener = actionListener; } public boolean add(T e) { boolean b = super.add(e); if (b) { notifyChange(); } return b; } private void notifyChange() { actionListener.actionPerformed(null); } ..... } 

这是我对Hibernate提供程序的实现:

http://pastebin.com/8cPB96bZ

通常,您只需标记在使用@PreCollectionChange批注的脏集合的情况下应调用的方法。