每次调用 save() 之前更新实体的某个字段

Update a certain field of an entity everytime before calling save()

所以我有三个实体。 A、B和P(P超class)。他们是这样的:

@MappedSuperclass
public class P {

    @Id
    @GeneratedValue
    protected Long id;

    protected LocalDateTime lastUpdated = LocalDateTime.now();
   
  //Other fileds, getters, setters, etc...
 
}

@Entity
@Table
public class A extends P {

  //fileds, getters, setters, etc..
 
}

@Entity
@Table
public class B extends P {

  //fileds, getters, setters, etc..
 
}

而且我有实体 A 和 B 的存储库

@Repository
public interface ARepository extends JpaRepository<A, Long> {

}

B 存储库

@Repository
public interface BRepository extends JpaRepository<B, Long> {

}

当我保存实体时,我必须每次都在 save() 之前调用 setter 方法来更新字段 lastUpdated ,如下所示:

@Service
public class AService {
  
    private final ARepository aRepository;

    @Autowired
    public AService(ARepository aRepository){
        this.aRepository= aRepository;
    }

    public A doSomethingToA(A a){
        //Run some logic here...
        a.setLastUpdated(LocalDateTime.now()); // I dont want this line one very update method of every entity. is there a way to put it inside the save() method (overriding or something), or any other solution to this?
        return aRepository.save(a);
    }
}

这里的问题是,如果我有 200 个扩展 class P 的实体,我必须在每次调用 save() 之前调用此 setLastUpdated() 方法。无论如何我可以把这一行放在保存方法中吗? (无需覆盖扩展 P 的 200 个实体的所有 200 个存储库上的保存)。

您可以在 class P 上使用 Hibernate 的 EntityListener :

public class P {

    @PreUpdate
    @PrePersist
    public void setLastUpdated() {
       lastUpdated = LocalDateTime.now();
    }
}

关于它的官方文档:https://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/listeners.html