Java Hibernate Envers-被审计实体可以';无法从空的审核表关系中恢复ID

Java Hibernate Envers-被审计实体可以';无法从空的审核表关系中恢复ID,java,hibernate,entity,Java,Hibernate,Entity,我需要一些关于Hibernate Envers的帮助。我有以下情况: 我在Hibernate/JPA中有一个实体,该实体具有正常配置: package com.algar.fsw.siscos.model; /** * TbUsuario generated by hbm2java */ @Entity @Table(name = "SCCTB023_USUARIO") @Audited @AuditTable("SCCTB047_USUARIO_ADTRA") public cl

我需要一些关于Hibernate Envers的帮助。我有以下情况:

我在Hibernate/JPA中有一个实体,该实体具有正常配置:

    package com.algar.fsw.siscos.model;

/**
 * TbUsuario generated by hbm2java
 */
@Entity
@Table(name = "SCCTB023_USUARIO")
@Audited
@AuditTable("SCCTB047_USUARIO_ADTRA")
public class Usuario implements java.io.Serializable {

    @Id
    @Column(name = "NU_USUARIO", nullable = false, scale = 0)
    @NotNull
    private Long id;

    @Column(name = "NO_USUARIO", nullable = false, length = 50)
    @NotNull
    @Length(max = 50)
    private String nome;

    @Column(name = "NO_LOGIN", unique = true, nullable = false, length = 16)
    @NotNull
    @Length(max = 16)
    private String login;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "NU_PERFIL", nullable = false)
    private Perfil perfil = new Perfil();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "usuario" , cascade = CascadeType.ALL)
    private List<UsuarioGrupo> usuariosGrupos = new ArrayList<UsuarioGrupo>();

    public Usuario() {
    }

    public Usuario(Long id ) {
        this.id = id;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getLogin() {
        return login;
    }
    public void setLogin(String login) {
        this.login = login;
    }

    public Perfil getPerfil() {
        return perfil;
    }
    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }

    public List<UsuarioGrupo> getUsuariosGrupos() {
        return usuariosGrupos;
    }
    public void setUsuariosGrupos(List<UsuarioGrupo> usuariosGrupos) {
        this.usuariosGrupos = usuariosGrupos;
    }
}
当我检索Usuario信息时,一切正常,但是当我调用方法getPerfil时,由于关系的ID,我收到一个NoEntityFoundException。数据仅存在于常规表中,在已审核表中,数据不存在,因为已审核表是在原始表中已存在数据之后创建的,因此未在已审核表上放置任何记录。我只需要恢复ID,不需要Perfil提供的数据。因此,如果我调用getPerfil,我只需要ID信息

有人知道这类问题的解决方法吗

我之所以需要它,是因为一个WEB应用程序有一个屏幕,显示某些实体中的更改,显示值:创建日期、更改属性、更改之前的值和更改之后的值。因此,我正在构建逻辑,以便在java中手动比较修订

拜托,有人能帮我吗


谢谢

如果您在开始使用Envers之前有数据,您应该创建一个包含所有数据的初始“0”修订版。

如果您在开始使用Envers之前有数据,您应该创建一个包含所有数据的初始“0”修订版。

我有类似的问题,也是唯一的解决方案(变通办法)帮助我的是手动插入envers之前的所有数据,作为初始版本1,时间戳为零(1970-01-01)。对于您的情况,可能是这样的:

INSERT INTO REVINFO(REV, REVTSTMP) VALUES(1, 0);

INSERT INTO SCCTB047_USUARIO_ADTRA
(REV, REVTYPE, NU_USUARIO, NO_USUARIO, NO_LOGIN, NU_PERFIL)
SELECT 1, 0, NU_USUARIO, NO_USUARIO, NO_LOGIN, NU_PERFIL FROM SCCTB023_USUARIO;

INSERT INTO SCCTB042_PERFIL_ADTRA
(REV, REVTYPE, NU_PERFIL, NO_PERFIL, IC_ATIVO, NU_NIVEL)
SELECT 1, 0, NU_PERFIL, NO_PERFIL, IC_ATIVO, NU_NIVEL FROM SCCTB018_PERFIL;

我也有类似的问题,唯一能帮助我的解决方案(解决方法)是手动插入envers之前的所有数据,作为初始版本1,时间戳为零(1970-01-01)。对于您的情况,可能是这样的:

INSERT INTO REVINFO(REV, REVTSTMP) VALUES(1, 0);

INSERT INTO SCCTB047_USUARIO_ADTRA
(REV, REVTYPE, NU_USUARIO, NO_USUARIO, NO_LOGIN, NU_PERFIL)
SELECT 1, 0, NU_USUARIO, NO_USUARIO, NO_LOGIN, NU_PERFIL FROM SCCTB023_USUARIO;

INSERT INTO SCCTB042_PERFIL_ADTRA
(REV, REVTYPE, NU_PERFIL, NO_PERFIL, IC_ATIVO, NU_NIVEL)
SELECT 1, 0, NU_PERFIL, NO_PERFIL, IC_ATIVO, NU_NIVEL FROM SCCTB018_PERFIL;

您需要对表进行本机sql查询并提取id。您需要首先提取修订id(进行查询),然后重新请求数据(使用本机查询获取必要的id)

您需要对表进行本机sql查询并提取id。您需要首先提取修订id(进行查询),然后重新请求数据(使用本机查询获取所需id)

我有同样的问题,您知道生成“0”修订版的方法吗?只需将现有表中的所有数据复制到“0”修订版中即可。我有同样的问题,您知道生成“0”修订版的方法吗?只需将现有表中的所有数据复制到“0”修订版中即可。