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进行持久化,然后通过创建自己的查询来解决这个问题。