Java 在save上修改Hibernate实体
已登录用户创建一个项目。我想在持久化到DB之前更新ProjectModel的createdBy字段Java 在save上修改Hibernate实体,java,spring,hibernate,spring-security,Java,Spring,Hibernate,Spring Security,已登录用户创建一个项目。我想在持久化到DB之前更新ProjectModel的createdBy字段 @Entity @Table(name = "PROJECTS") @Inheritance(strategy = InheritanceType.JOINED) public @Data class ProjectModel extends BaseModel { @Length(min = 4, max = 30) @NotNull private String na
@Entity
@Table(name = "PROJECTS")
@Inheritance(strategy = InheritanceType.JOINED)
public @Data class ProjectModel extends BaseModel {
@Length(min = 4, max = 30)
@NotNull
private String name;
@NotNull
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "USER_ID")
private User createdBy;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "PROJECT_ID")
private List<RinexFileModel> rinexFileModels;
@Enumerated(EnumType.STRING)
private Status status = Status.NEW;
public void addRinexFiles(List<RinexFileModel> rinexFiles) {
this.rinexFileModels.addAll(rinexFiles);
}
public void addRinexFile(RinexFileModel rinexFile) {
this.rinexFileModels.add(rinexFile);
}
public enum Status {
NEW, READY, PROCESSING, PROCESSED
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
调试结果(用户已成功添加,但createdBy的@NotNull验证出现异常)
修复方法是:同时修改状态数组。但是没有一个好的解决方案
在模型保存可用于Spring data@CreateBy注释之前填充用户数据。 先检查一下这个 由于基于用户服务返回UserPrincipal的spring安全性,用户+嵌入式类UserPrincipal已更改为仅UserPrincipal。因此,将项目更改为一个用户模型对我来说并不是什么大问题 启用JPA审核 结果
您是否检查jpa audit中的@CreatedBy注释?是的,它现在可以工作了
public class HibernateInterceptorImpl extends EmptyInterceptor {
@Resource
private HibernateInterceptorStrategy hibernateInterceptorStrategy;
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
boolean entityChanged = false;
final EmptyInterceptor interceptor = hibernateInterceptorStrategy.getStrategy(entity);
if (nonNull(interceptor)) {
entityChanged = interceptor.onSave(entity, id, state, propertyNames, types);
}
return entityChanged;
}
}
@Component("hibernateInterceptorStrategy")
public class HibernateInterceptorStrategy {
@Resource
private Map<Class, EmptyInterceptor> hibernateInterceptorStrategies;
public EmptyInterceptor getStrategy(Object object) {
for (Class clazz : hibernateInterceptorStrategies.keySet()) {
if (object.getClass() == clazz) {
return hibernateInterceptorStrategies.get(clazz);
}
}
return null;
}
}
public class ProjectInterceptorImpl extends EmptyInterceptor {
@Resource
private SessionService sessionService;
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
final ProjectModel project = (ProjectModel) entity;
if (isNull(project.getCreatedBy())) {
project.setCreatedBy(sessionService.getCurrentUser());
}
return true;
}
}