2017-09-18 14 views
0

J'essaie d'auditer un objet. Mon problème est, je ne reçois pas sur chaque base de données le même résultat.javers CdoSnapshot.SnapshotType différent de mssql à h2

Mon entité:

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; 
    } 
} 

La méthode d'essai:

@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())); 
} 

Sur MSSQL avec openjpa mon SystemOut ressemble à ceci:

MISE À JOUR

INITIALE

INITIALE

Sur H2 Le résultat est différent:

MISE À JOUR

MISE À JOUR

INITIALE

Je dirais que la première sortie est erroné. N'est-ce pas? Pourquoi sont-ils différents? Ce que je fais mal?

J'ai créé Javers pour MSSQL si:

@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(); 
    } 
}; 

Et pour 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; 
    } 
}; 

Toute idée?

Merci

Mise à jour:

Si je MSSQL sans openjpa:

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; 
    } 
}; 

Il fonctionne comme prévu.

MISE À JOUR

MISE À JOUR

INITIAL

Ai-je fait quelque chose de mal avec openjpa?

Update 2 Je tends mon cas de test avec une autre entité (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); 
} 

Le jv_snapshot de table dans le MSSQL a maintenant les documents suivants:

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 

La première entité a un mauvais deuxième type (initial) et a également une mauvaise version. La deuxième entité a l'air ok pour moi.

Est-ce un bug?

Répondre

0

On dirait que votre application et vos javers utilisent différentes connexions (et transactions) db. Javers n'a pas de support d'intégration pour openjpa. Cela signifie que vous devez mettre en œuvre ConnectionProvider-transaction au courant (comme décrit dans https://javers.org/documentation/repository-configuration/#connection-provider)

Voir comment faire pour Hibernate: https://github.com/javers/javers/blob/master/javers-spring/src/main/java/org/javers/spring/jpa/JpaHibernateConnectionProvider.java