2017-09-18 1 views
0

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?

Antwort

0

Scheint wie Ihre Anwendung und Javers verschiedene DB-Verbindungen (und Transaktionen) verwenden. Javers hat keine Integrationsunterstützung für openjpa. Es bedeutet, dass Sie transaktions bewusst Connection implementieren müssen (wie in https://javers.org/documentation/repository-configuration/#connection-provider beschrieben)

Sehen Sie, wie es für Hibernate getan: https://github.com/javers/javers/blob/master/javers-spring/src/main/java/org/javers/spring/jpa/JpaHibernateConnectionProvider.java

Verwandte Themen