Spring Hibernate和JPA@PreUpdate和@PrePersist不工作

Spring Hibernate和JPA@PreUpdate和@PrePersist不工作,spring,hibernate,jpa,Spring,Hibernate,Jpa,我试图在更新或保存之前运行一些代码。我的实体中有: @Data @EqualsAndHashCode(callSuper=false) @Table(name="file_management", uniqueConstraints = { @UniqueConstraint(columnNames = {"name"})}) @Entity public class FileManagement { @Id @GeneratedValue(strategy= Generatio

我试图在更新或保存之前运行一些代码。我的实体中有:

@Data
@EqualsAndHashCode(callSuper=false)
@Table(name="file_management", uniqueConstraints = { @UniqueConstraint(columnNames = {"name"})})
@Entity
public class FileManagement {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private long id;

    @Column(name="name")
    private String name;

    @Column(name = "SEARCH_STRING", length = 1000)
    @Getter @Setter
    private String searchString;

    @PreUpdate
    @PrePersist
    void updateSearchString() {

        final String fullSearchString = StringUtils.join(Arrays.asList(
                name),
                " ");

        this.searchString = StringUtils.substring(fullSearchString, 0, 999);

    }
}
我的FileManagementRepository中有:

    @Transactional
    @Modifying
    @Query("UPDATE FileManagement SET name = :name WHERE id = :id")
    public void updateFile(long id, String name);

    @Transactional
    @Modifying
    @Query(value = "INSERT INTO file_management (name, filename, created_by, create_date, is_active, is_deleted) VALUES (:name, :filename, :createdBy, :createdDate, :isActive, :isDeleted)", nativeQuery = true)
    public void createFileWithFilename(String name, String filename, String createdBy, Date createdDate, boolean isActive, boolean isDeleted);

在我的FileManagementService.java中

public void updateFileWithFilename(String id, String name) {
        fileManagementRepository.updateFile(Long.parseLong(id), name);
    }
public boolean createFileWithFilename(String name, String filename, String createdBy, Date createdDate, boolean isActive, boolean isDeleted) {
        fileManagementRepository.createFileWithFilename(name, filename, createdBy, createdDate, isActive, isDeleted);
        return true;
    }
但问题是,当我更新或插入新行时,不会调用updateSearchString()方法。搜索字符串列为(空)


请帮忙。谢谢。

我猜以这种方式使用本机SQL或JPQL插入或更新的实体将绕过持久性上下文,而持久性上下文将不会管理它们。但是,
@PreUpdate
@PrePersist
仅适用于由持久性上下文管理的实体,因此您的
@PreUpdate
@PrePersist
将不会对它们执行

我认为您应该以更JPA的方式插入和更新实体,以确保持久性上下文能够管理它们:

@Service
public class FileManagementService{

    @Autowired
    private FileManagementRepository fileManagementRepository;

    @Transactional 
    public void updateFileWithFilename(String id, String name) {
       Optional<FileManagement> file= fileManagementRepository.findById(id);
       if(file.isPresent()){
           file.get().setName(name);
       }else{
          throw new RuntimeException("Record does not exist");
       }
    }

    @Transactional 
    public void createFileWithFilename(String name, String filename, String createdBy, Date createdDate, boolean isActive, boolean isDeleted) {
       FileManagement file= new FileManagement(name,fileName,........);
       fileManagementRepository.save(file);
    }
}
@服务
公共类文件管理服务{
@自动连线
私有文件管理存储库文件管理存储库;
@交易的
public void updateFileWithFilename(字符串id、字符串名称){
可选文件=fileManagementRepository.findById(id);
if(file.isPresent()){
file.get().setName(名称);
}否则{
抛出新的RuntimeException(“记录不存在”);
}
}
@交易的
public void createFileWithFilename(字符串名称、字符串文件名、字符串createdBy、日期createdDate、布尔值isActive、布尔值isDeleted){
FileManagement file=新文件管理(名称、文件名……);
fileManagementRepository.save(文件);
}
}

您正在使用查询进行更新,而不是使用实体。为什么?基本上,您使用JPA进行持久化,然后通过创建自己的查询来解决这个问题。