0

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

我的实体:

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 如下所示:

更新

最初的

最初的

在 H2 上,结果看起来不同:

更新

更新

最初的

我会说第一个输出是错误的。不是吗?为什么他们不同。我做错了什么?

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

它按预期工作。

更新

更新

最初的

我对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

第一个实体的第二个类型(初始)错误,并且版本也错误。第二个实体对我来说看起来不错。

它是一个错误吗?

4

1 回答 1

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

于 2017-09-20T07:23:09.133 回答