【发布时间】:2020-06-14 06:19:25
【问题描述】:
登录用户创建一个项目。我想在持久化到数据库之前更新 ProjectModel 的 createdBy 字段。
@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);
}
}
至少有两种选择。
-
通过回调方法(@PrePersist等)类似于下面的代码,但我需要UserModel和访问spring bean
类似这个SpringContextexample
HibernateInterceptorImpl 拦截器
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;
}
}
ProjectInterceptor 实现
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;
}
}
调试结果(用户成功添加,但在 @NotNull 验证 createdBy 时出现异常)
FIX IS:同时修改状态数组。但是对此没有好的解决方案。
【问题讨论】:
-
你检查来自 jpa 审计的 @CreatedBy 注释吗?
-
是的,现在可以使用
标签: java spring hibernate spring-security