Chr*_*ams 5 java audit spring hibernate
注意:这是一个复杂的问题,所以我希望我已经涵盖了相关部分.如果没有,我将根据要求编辑和添加更多信息.
我们正在使用Spring(4.1.0)和Hibernate(4.3.6),我们已经定义了一个基类,我们所有的实体都扩展了它们BaseAuditableEntity(下面的代码).当任何实体在一个@Transactional方法被加载,然后修改并保存,该实体的modified_by_user_id和modified_ts都与登录的执行正在取得任何更改的用户的ID进行更新.
我们的问题是,每当一个AppUser(这也延伸BaseAuditableEntity)在其中一个被加载@Transactional方法,它也看到了modified_by_user_id和modified_ts,即使它没有被修改设定.这会产生一个问题,因为我们在不需要的时候几乎每个请求都写入我们的用户表.请注意,这也可能会影响@Transactional未AppUser显式加载的方法,因为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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我们JpaConfig:
@Configuration
@EnableJpaRepositories(basePackages = {
"blah.blah.blah"})
@ComponentScan(basePackageClasses = {AuditorBean.class})
@EnableTransactionManagement
@EnableJpaAuditing(auditorAwareRef = "auditorBean")
public class JpaConfig extends BaseConfig {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我们的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的建议是保持审计简单并定义
@CreatedBy
private Long createdBy;
Run Code Online (Sandbox Code Playgroud)
没有实际关联并仅存储 AppUser 的 id。
@Component 公共类 AuditorBean 实现 AuditorAware {
@Override
public Long getCurrentAuditor() {
// .... find out the id
return id;
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |