我尝试审核一个对象。我的问题是,我没有在每个数据库上得到相同的结果。
我的实体:
public class Person {
@Id
private String login;
private String name;
public Person(String login, String name) {
this.login = login;
this.name = name;
}
public String getLogin() {
return login;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试方法:
@Test
public void testperson() throws SQLException {
Person entity = new Person("bob", "Robert Martin");
javers.commit("user", entity);
entity.setName("Robert C.");
javers.commit("user", entity);
entity.setName("Robert B.");
javers.commit("user", entity);
List<CdoSnapshot> snapshots = javers.findSnapshots(QueryBuilder.byInstanceId("bob", Person.class).build());
snapshots.forEach(a -> System.out.println(a.getType().toString()));
}
在使用openjpa的mssql上,我的systemout如下所示:
更新
INITIAL
INITIAL
在H2上,结果看起来不同:
更新
更新
INITIAL
我会说第一个输出是错误的。不是吗? 他们为什么不同。我做错了什么?
我为mssql创建了javers:
@Before
public void setUp() {
JaversSqlRepository sqlRepository = SqlRepositoryBuilder.sqlRepository().withConnectionProvider(connectionProvider).withDialect(DialectName.MSSQL).build();
javers = JaversBuilder.javers().registerJaversRepository(sqlRepository).build();
}
ConnectionProvider connectionProvider = new ConnectionProvider() {
@Override
public Connection getConnection() {
OpenJPAEntityManager kem = OpenJPAPersistence.cast(entityManager);
return (Connection) kem.getConnection();
}
};
对于h2:
@Before
public void setUp() {
JaversSqlRepository sqlRepository = SqlRepositoryBuilder.sqlRepository().withConnectionProvider(connectionProvider).withDialect(DialectName.H2).build();
javers = JaversBuilder.javers().registerJaversRepository(sqlRepository).build();
}
ConnectionProvider connectionProvider = new ConnectionProvider() {
@Override
public Connection getConnection() {
return dbConnectionh2;
}
};
有什么想法吗?
谢谢
更新
如果我使用没有openjpa的mssql:
private final Connection localhostConnection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=aDatabase;user=*******;password=********");
@Before
public void setUp() {
JaversSqlRepository sqlRepository = SqlRepositoryBuilder.sqlRepository().withConnectionProvider(connectionProvider).withDialect(DialectName.MSSQL).build();
javers = JaversBuilder.javers().registerJaversRepository(sqlRepository).build();
}
ConnectionProvider connectionProvider = new ConnectionProvider() {
@Override
public Connection getConnection() {
return localhostConnection;
}
};
它按预期工作。
更新
更新
INITIAL
我是否对openjpa做错了什么?
更新2 我用另一个实体(bob1)扩展我的测试用例:
@Test
public void testPerson() throws SQLException {
Person entity = new Person("bob", "Robert Martin");
javers.commit("user", entity);
entity.setName("Robert C.");
javers.commit("user", entity);
entity.setName("Robert B.");
javers.commit("user", entity);
Person entity1 = new Person("bob1", "Robert Martin");
javers.commit("user", entity1);
entity1.setName("Robert C.");
javers.commit("user", entity1);
entity1.setName("Robert B.");
javers.commit("user", entity1);
}
mssql中的表jv_snapshot现在具有以下记录:
snapshot_pk type version global_id_fk
0 INITIAL 1 0
1 INITIAL 1 0
2 UPDATE 2 0
3 INITIAL 1 1
4 UPDATE 2 1
5 UPDATE 3 1
第一个实体的第二个类型(初始)错误,版本也错误。第二个实体对我来说没问题。
这是一个错误吗?
答案 0 :(得分:0)
似乎您的应用程序和javers正在使用不同的数据库连接(和事务)。 Javers没有对openjpa的集成支持。这意味着您需要实现事务感知的ConnectionProvider(如https://javers.org/documentation/repository-configuration/#connection-provider中所述)
了解Hibernate是如何完成的: https://github.com/javers/javers/blob/master/javers-spring/src/main/java/org/javers/spring/jpa/JpaHibernateConnectionProvider.java