spring - Hibernate 和 JPA @PreUpdate 和 @PrePersist 不起作用
问题描述
我正在尝试在更新或保存之前运行一些代码。我在我的实体中有:
@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 列是(空)
请帮忙。谢谢。
解决方案
我猜想以这种方式使用本机 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);
}
}
推荐阅读
- python - 使用正则表达式遍历字典以获取价值
- javascript - 如何使用 JQUERY animate scrollTop 滚动固定元素?
- javascript - 如何在Vue中关闭一页之前存储数据
- java - LWJGL 纹理渲染/索引
- python - “pipenv install tensorflow”卡在“锁定...”
- android - Mapbox 上次定位失败 React native
- numpy - Numpy 到 QImage 崩溃
- right-to-left - 为什么在使用某些 RTL 插件(如阿拉伯语和 RTL 支持或 RTL PLZ)时出现“插件运行时中止”?
- sql - 根据给定的比例从 postgres 表中采样一定数量的结果行
- r - 在 r 中拆分字符串,而第一列保持不变