【问题标题】:Hibernate and JPA @PreUpdate and @PrePersist not workingHibernate 和 JPA @PreUpdate 和 @PrePersist 不起作用
【发布时间】:2019-06-03 05:07:37
【问题描述】:

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

@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() 方法。 search_string 列为 (null)

请帮忙。谢谢。

【问题讨论】:

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

标签: spring hibernate jpa


【解决方案1】:

我猜想以这种方式使用本机 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);
    }
}

【讨论】:

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