javers CdoSnapshot.SnapshotType不同于mssql到h2

时间:2017-09-18 12:55:27

标签: java sql-server openjpa javers

我尝试审核一个对象。我的问题是,我没有在每个数据库上得到相同的结果。

我的实体:

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

第一个实体的第二个类型(初始)错误,版本也错误。第二个实体对我来说没问题。

这是一个错误吗?

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