繁体   English   中英

即使没有任何变化,Spring Auditable实体也会被修改

[英]Spring Auditable entity is being modified even when nothing has changed

注意:这是一个复杂的问题,所以我希望我已经涵盖了相关部分。 如果没有,我将根据要求编辑和添加更多信息。

我们正在使用Spring(4.1.0)和Hibernate(4.3.6),我们已经定义了一个基类,我们所有的实体都扩展为BaseAuditableEntity (下面的代码)。 当任何实体在@Transactional方法中加载然后进行修改和保存时,该实体的modified_by_user_idmodified_ts都将使用登录的用户的id进行更新,以执行正在进行的任何更改。

我们的问题是每当AppUser (也扩展BaseAuditableEntity)被加载到其中一个@Transactional方法中时,它也会看到modified_by_user_idmodified_ts被设置,即使它没有被修改。 这会产生一个问题,因为我们在不需要的时候几乎每个请求都写入我们的用户表。 请注意,这也可能会影响未显式加载AppUser @Transactional方法,因为AuditorBean会加载AppUser本身。

我假设这与AppUser实体是BaseAuditableEntity本身的一部分有关。 有人能证实吗? 有没有办法解决这个问题?

我们的BaseAuditableEntity类,包括AppUser在内的每个实体都扩展了:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseAuditableEntity implements Auditable<AppUser, Long> {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hibernate_sequence")
    @SequenceGenerator(name = "hibernate_sequence", sequenceName = "blah_sequence", allocationSize = 1)
    @Column(name = "id")
    private Long id;

    @CreatedBy
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "created_by_user_id")
    private AppUser createdBy;

    @LastModifiedBy
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "modified_by_user_id")
    private AppUser lastModifiedBy;

    @Column(name = "created_ts")
    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Column(name = "modified_ts")
    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    // ...
}

我们的JpaConfig

@Configuration
@EnableJpaRepositories(basePackages = {
        "blah.blah.blah"})
@ComponentScan(basePackageClasses = {AuditorBean.class})
@EnableTransactionManagement
@EnableJpaAuditing(auditorAwareRef = "auditorBean")
public class JpaConfig extends BaseConfig {

    // ...

}

我们的AuditorBean

@Component
public class AuditorBean implements AuditorAware<AppUser> {

    @Override
    public AppUser getCurrentAuditor() {
        // omitting some code that finds a user. I think the only relevant thing here
        // is that we're using the repo to find the user by ID and not using an
        // entity that's already been loaded
        return userRepository.findOne(id);
    }

}

我的建议是保持审计简单和严格

@CreatedBy
private Long createdBy;

没有实际关联和存储只有AppUser的ID。

@Component公共类AuditorBean实现AuditorAware {

@Override
public Long getCurrentAuditor() {
    // .... find out the id
    return id;
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM