添加到集合时不会触发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); } ..... }