Ich versuche, ein Objekt zu überwachen. Mein Problem ist, ich bekomme nicht auf jeder Datenbank das selbe Ergebnis.javers CdoSnapshot.SnapshotType unterscheidet sich von mssql zu h2
Meine Einheit:
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;
}
}
Die Testmethode:
@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()));
}
Auf mssql mit openjpa sieht mein SystemOut wie folgt aus:
UPDATE
ERSTE
ERSTE
Auf H2 sieht das Ergebnis anders aus:
UPDATE
UPDATE
ERSTE
Ich würde sagen, die erste Ausgabe falsch ist. Ist es nicht? Warum sind sie anders? Was ich falsch mache?
I erstellt Javers für mssql so:
@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();
}
};
Und für 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;
}
};
Jede Idee?
Danke
Update:
Wenn ich mssql ohne openjpa verwenden:
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;
}
};
Es funktioniert wie erwartet.
UPDATE
UPDATE
ERSTE
Habe ich etwas falsch mit openjpa getan?
Update 2 ich meinen Testfall mit einem anderen Unternehmen (bob1) erweitern:
@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);
}
Die Tabelle jv_snapshot im MSSQL hat jetzt die folgenden Einträge:
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
die erste Einheit hat einen falschen zweiten Typ (initial) und hat auch eine falsche Version. Die zweite Entität sieht für mich ok aus.
Ist es ein Fehler?