预更新添加到集合时未触发

2022-09-04 04:03:01

我有一个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<Employee> minions = new ArrayList<Employee>();

    @PreUpdate
    public void preUpdate(){ ... }
}

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

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


答案 1

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

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


答案 2

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

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

public class Employee {
    ....

    private List<Employee> minions = createChangeNotifierList();

    private List<Employee> createChangeNotifierList() {
        ChangeNotifierList<Employee> l = new ChangeNotifierList<Employee>();
        l.setActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                preUpdate();
            }
        });
        return l;
    }

    public void setMinions(List<Employee> l) {
        if (!(l instanceof ChangeNotifierList)) {
            l = createChangeNotifierList();
            preUpdate();
        }
        this.minions = l;
    }

    public void preUpdate(){ ... }
}


public class ChangeNotifierList<T> extends ArrayList<T> {

    private ActionListener actionListener;

    public ChangeNotifierList() {
    }

    public ChangeNotifierList(List<T> 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);
    }

    .....
}

推荐