Rob*_*rto 10 java spring hibernate jpa hibernate-envers
应用程序spring + jpa + envers(hibernate)envers需要在特殊表中保存实体的历史记录.
在我保存了几次实体之后,我希望在USER表中看到填充版本字段,在USER_AUT中看到填充版本字段.但实际的结果是user表中正确的值,但在版本colums添加REV_TYPE,REV列(在现场只是种台的所有行)和空.
我使用4.0.1.Final hibernate
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.0.1.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是,当我查看表时,Version字段中的所有值都为null
我的实体是
import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.Audited;
import javax.persistence.*;
@Entity
@Audited
@Table(name = "User", uniqueConstraints = {
@UniqueConstraint(columnNames = { "prKey"})})
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
@Getter
@Setter
public class User {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "PR_KEY", unique = true)
private String prKey;
@Column(name = "name", length = 100, unique = false)
private String name;
@Version
private int version;
public User(String name){
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
当我获得使用审计的实体时:
public List<User> getHistory(String id) {
AuditReader auditReader = AuditReaderFactory.get(entityManagerFactory.createEntityManager());
List<Number> auditVersions = auditReader.getRevisions(User.class, id);
List<User> users = auditVersions.stream().map(item -> auditReader.find(User.class, id, item.intValue())).collect(Collectors.toList());
return extractRiskMetrics(riskMetricRecords);
}
Run Code Online (Sandbox Code Playgroud)
所以,我的持久性 - 配置是
@Configuration
@EnableTransactionManagement
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {"persistence"})
@ComponentScan(basePackages = {"persistence", "model"})
public class PersistenceConfig {
private static final String PACKAGE_WITH_JPA_ENTITIES = "persistence";
private final Logger log = Logger.getLogger(getClass());
@Bean
@Resource(type = DataSource.class, lookup = "jdbc/MyDatasource", name = "jdbc/MyDatasource")
public DataSource dataSource() {
final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
dsLookup.setResourceRef(true);
DataSource dataSource = dsLookup.getDataSource("java:comp/env/jdbc/MyDatasource");
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
entityManager.setDataSource(dataSource());
entityManager.setPackagesToScan(PACKAGE_WITH_JPA_ENTITIES);
entityManager.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManager.setJpaProperties(getHibernateProperties());
log.info("Entity Manager configured.");
return entityManager;
}
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
//Set properties hibernate
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.hbm2ddl.auto", "none");
properties.put("org.hibernate.envers.do_not_audit_optimistic_locking_field", false);
properties.put("verifyServerCertificate", false);
properties.put("useSSL", false);
properties.put("requireSSL", false);
properties.put("useLegacyDatetimeCode", false);
properties.put("useUnicode", "yes");
properties.put("characterEncoding", "UTF-8");
properties.put("serverTimezone", "UTC");
properties.put("useJDBCCompliantTimezoneShift", true);
return properties;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
org.hibernate.envers.do_not_audit_optimistic_locking_field设置为false,但版本字段仍为null.
可能它与冲突Spring Data Jpa和Hibernate - envers有关吗?
实际上,执行的查询(更改和fc)
[1/22/19 14:04:51:996 MSK] 00000096 SystemOut O Hibernate: update UserRecord set User=?, version=? where PR_KEY=? and version=?
[1/22/19 14:04:51:998 MSK] 00000096 SystemOut O Hibernate: select hibernate_sequence.nextval from dual
[1/22/19 14:04:52:000 MSK] 00000096 SystemOut O Hibernate: insert into REVINFO (REVTSTMP, REV) values (?, ?)
[1/22/19 14:04:52:002 MSK] 00000096 SystemOut O Hibernate: insert into UserRecord_AUD (REVTYPE, busId, User, UserType, someInfo, PR_KEY, REV) values (?, ?, ?, ?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
那么,在AUD表中没有版本=?
查看配置设置org.hibernate.envers.do_not_audit_optimistic_locking_field。
此配置设置控制 Hibernate Envers 是否@Version在审核模式中包含带注释的字段。默认情况下,该设置true意味着不会审核乐观锁定字段。通过将其设置为false,您将审核该列的值。
我确实想提醒您不要将此字段设置为false。
如果您的应用程序执行显式乐观锁定增量功能,则即使在业务流程中没有更改任何其他数据库列,这也会导致将其他行添加到审核历史记录表中。这是因为一旦您启用@Version要跟踪的字段,Hibernate Envers 就会将它们视为实体上的任何其他基本属性。因此,强制乐观锁增量将触发审核更改。
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |