【问题标题】:JPA @PrePersist and @PreUpdate order when using inheritance使用继承时的 JPA @PrePersist 和 @PreUpdate 顺序
【发布时间】:2014-12-01 21:02:13
【问题描述】:

假设以下代码 sn-p 使用 @PrePersist 和 @PreUpdate 注释和 Joined-type 继承:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class A {
    ...

    @PrePersist
    private void prePersist() {
        ...
    }

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

@Entity
@DiscriminatorValue("B")
public class B extends A {
    ...

    @PrePersist
    private void prePersist() {
        ...
    }

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

问题:我们可以依赖回调方法的任何执行顺序吗?

例如,当持久化类 A 和 B 时,B 中的 prePersist 方法会在 A 中的 prePersist 方法之前执行,反之亦然?

我们可以假设B中的prePersist会在A类被持久化之前执行吗?

【问题讨论】:

    标签: jpa inheritance callback joined-subclass


    【解决方案1】:

    是的。首先将执行超类回调。

    当一个事件被引发时,监听器会按这个顺序执行:

    @EntityListeners for a given entity or superclass in the array order
    
    Entity listeners for the superclasses (highest first)
    
    Entity Listeners for the entity
    
    Callbacks of the superclasses (highest first)
    
    Callbacks of the entity
    

    有关更多详细信息,请阅读:

    上的“回调和侦听器继承”

    https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/listeners.html

    【讨论】:

    • 不要放链接,因为它会放一些重要的部分
    【解决方案2】:

    对我来说,解决方案是使用注释

    例子:

    import lombok.Data;
    
    import javax.persistence.Column;
    import javax.persistence.MappedSuperclass;
    import javax.persistence.PrePersist;
    import java.time.LocalDateTime;
    
    @Data
    @MappedSuperclass
    public abstract class AuditObject {
    
        @Column(name = "dat_created")
        private LocalDateTime createdAt;
    
        @PrePersist
        public void onPrePersist() {
            this.createdAt = LocalDateTime.now();
        }
    
    }
    
    @Entity
    public class Person extends AuditObject {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多