QueryBuilder из одной базы данных не считывает данные аудита, созданные другим JaversRepository, из другой базы данных - PullRequest
0 голосов
/ 24 июня 2019

Следующее - моя проблема.Предварительное условие: весеннее загрузочное приложение 1 (SB1) с базой данных 1.Приложение Spring boot2 (SB2) с базой данных 2.

Оба приложения записывают данные аудита javers в базу данных 3.

SB1 проверяет данные для объекта E1.

SB2 проверяет данные для объекта E2.

QueryBuilder из SB1 не может правильно прочитать данные аудита для E2.

Он выбирает только изменения типа NewObject, связанные с E2.

QueryBuilder из SB1 может читать данные аудита для E1в совершенстве.QueryBuilder из SB2 может отлично считывать данные аудита для E2.

Если SB1 может выполнить вызов REST для SB2, чтобы получить «изменения» из экземпляра QueryBuilder в SB2, он отлично работает.

QueryBuilder изSB1 должен иметь возможность правильно читать данные аудита для E2, поскольку предполагается, что проверенные данные не зависят от экземпляра JaversRepository.

Следующий код используется в обоих приложениях загрузки Spring для получения проверенных записей.

@RequestMapping("/javers")
public String audit() {
    QueryBuilder jqlQuery = QueryBuilder.anyDomainObject();
    Changes changes = javers.findChanges(jqlQuery.withNewObjectChanges().build());
    List<ChangesByCommit> changesByCommit = changes.groupByCommit();
    return javers.getJsonConverter().toJson(changesByCommit);
}

Следующие сущность, репозиторий, application.properties и 'вывод изменений jql' использовались в загрузочном приложении Spring1 (SB1)

`
package com.test.javers.entitya;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name = "EntityA")
public class EntityA implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "APPLICATION_ID")
    private String applicationId;

    @Column(name = "APP_NAME")
    private String appName;

    @Column(name = "CREATE_DATE")
    private Timestamp createDate;

    @Column(name = "DESCRIPTION")
    private String description;

    @Column(name = "IS_AUDIT_ENABLED")
    private Boolean isAuditEnabled;

    public EntityA() {
    }

    public String getApplicationId() {
        return applicationId;
    }

    public void setApplicationId(String applicationId) {
        this.applicationId = applicationId;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public Timestamp getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Timestamp createDate) {
        this.createDate = createDate;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Boolean getIsAuditEnabled() {
        return isAuditEnabled;
    }

    public void setIsAuditEnabled(Boolean isAuditEnabled) {
        this.isAuditEnabled = isAuditEnabled;
    }

}
--------------------------------------------------------------------
package com.test.javers.repository;

import org.javers.spring.annotation.JaversSpringDataAuditable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.test.javers.entitya.EntityA;

@Repository
@JaversSpringDataAuditable
public interface EntityARepository extends JpaRepository<EntityA, String>{
}
--------------------------------------------------------------------------
spring.datasource.url=jdbc:postgresql://localhost/sandbox1
spring.datasource.username=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.password=postgres

server.port=8010  

#Audit datasource configuration
spring.audit-datasource.url=jdbc:postgresql://localhost/sandboxaudit
spring.audit-datasource.username=postgres
spring.audit-datasource.password=postgres
spring.audit-datasource.driver-class-name=org.postgresql.Driver
-------------------------------------------------------------------------

[ { "changes": [ { "changeType": "NewObject", "globalId": { "entity": 
"com.test.javers.entityb.EntityB", "cdoId": "IEj5tvWc850834675" }, 
"commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:16:02.946", "commitDateInstant": "2019-06-25T13:46:02.946Z", "id": 
1.00 } } ], "commitMetadata": { "author": "EntityBUser", "properties": [ { 
"key": "applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:16:02.946", "commitDateInstant": "2019-06-25T13:46:02.946Z", "id": 
1.00 } } ]

`

Ниже приведены сущность и репозиторий, используемые для Spring Boot Application 2 (SB2)

`

package com.test.javers.entityb;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name = "EntityB")
public class EntityB implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "APPLICATION_ID")
    private String applicationId;

    @Column(name = "APP_NAME")
    private String appName;

    @Column(name = "CREATE_DATE")
    private Timestamp createDate;

    @Column(name = "DESCRIPTION")
    private String description;

    @Column(name = "IS_AUDIT_ENABLED")
    private Boolean isAuditEnabled;

    public EntityB() {
    }

    public String getApplicationId() {
        return applicationId;
    }

    public void setApplicationId(String applicationId) {
        this.applicationId = applicationId;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public Timestamp getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Timestamp createDate) {
        this.createDate = createDate;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Boolean getIsAuditEnabled() {
        return isAuditEnabled;
    }

    public void setIsAuditEnabled(Boolean isAuditEnabled) {
        this.isAuditEnabled = isAuditEnabled;
    }

    }

package com.test.javers.repository;

import org.javers.spring.annotation.JaversSpringDataAuditable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.test.javers.entityb.EntityB;

@Repository
@JaversSpringDataAuditable
public interface EntityBRepository extends JpaRepository<EntityB, String>{
}

spring.datasource.url=jdbc:postgresql://localhost/sandbox2
spring.datasource.username=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.password=postgres

server.port=8020

#Audit datasource configuration
spring.audit-datasource.url=jdbc:postgresql://localhost/sandboxaudit
spring.audit-datasource.username=postgres
spring.audit-datasource.password=postgres
spring.audit-datasource.driver-class-name=org.postgresql.Driver
------------------------------------------------------------------
[ { "changes": [ { "changeType": "ValueChange", "globalId": { "entity": 
"com.test.javers.entityb.EntityB", "cdoId": "IEj5tvWc850834675" }, 
"commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:17:07.676", "commitDateInstant": "2019-06-25T13:47:07.676Z", "id": 
2.01 }, "property": "description", "propertyChangeType": 
"PROPERTY_VALUE_CHANGED", "left": "EntityB", "right": "WjMVxZBX" } ], 
"commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:17:07.676", "commitDateInstant": "2019-06-25T13:47:07.676Z", "id": 
2.01 } }, { "changes": [ { "changeType": "ValueChange", "globalId": { 
"entity": "com.test.javers.entityb.EntityB", "cdoId": "IEj5tvWc850834675" }, 
"commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:16:02.946", "commitDateInstant": "2019-06-25T13:46:02.946Z", "id": 
1.00 }, "property": "applicationId", "propertyChangeType": 
"PROPERTY_VALUE_CHANGED", "left": null, "right": "IEj5tvWc850834675" }, { 
"changeType": "ValueChange", "globalId": { "entity": 
"com.test.javers.entityb.EntityB", "cdoId": "IEj5tvWc850834675" }, 
"commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:16:02.946", "commitDateInstant": "2019-06-25T13:46:02.946Z", "id": 
1.00 }, "property": "description", "propertyChangeType": 
"PROPERTY_VALUE_CHANGED", "left": null, "right": "EntityB" }, { 
"changeType": "NewObject", "globalId": { "entity": 
"com.test.javers.entityb.EntityB", "cdoId": "IEj5tvWc850834675" }, 
"commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:16:02.946", "commitDateInstant": "2019-06-25T13:46:02.946Z", "id": 
1.00 } 
} ], "commitMetadata": { "author": "EntityBUser", "properties": [ { "key": 
"applicationID", "value": "ViralSEQ" } ], "commitDate": "2019-06- 
25T19:16:02.946", "commitDateInstant": "2019-06-25T13:46:02.946Z", "id": 
1.00 } 
} ]

`

Обратите внимание, что« NewObject »появляется в обоих выходных данных, но остальные« changeTypes »отсутствуют в SB1, даже если база данных аудита одинакова.

1 Ответ

0 голосов
/ 26 июня 2019

Для этого должно работать приложение Java, которое запускает запросы должны иметь все классы из jv_snapshot в пути к классам. В приведенном выше случае необходимо убедиться, что EntityA и EntityB находятся в пути к классам. Тогда вы получите правильный вывод. Это означает, что вы не можете запустить запрос javers в любом jv_snapshot, не имея всех классов в «изменениях» в его пути к классам, или он будет возвращать только типы изменений «NewObject».

...