Java 在save上修改Hibernate实体

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

已登录用户创建一个项目。我想在持久化到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 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;
    }
}