簡體   English   中英

Hibernate Envers - 審計實體無法從空審計表關系中恢復 ID

[英]Hibernate Envers - Audited Entity can't recover ID from empty audited table relation

我需要一些關於 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;
    }
}

而且,這個實體與這個實體有關系:

package com.algar.fsw.siscos.model;

@Entity
@Table(name = "SCCTB018_PERFIL")
@Audited
@AuditTable("SCCTB042_PERFIL_ADTRA")
public class Perfil implements java.io.Serializable {

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

    @Column(name = "NO_PERFIL", nullable = false, length = 30)
    @NotNull
    @Enumerated(EnumType.STRING)
    private PerfilEnum perfilEnum;

    @Column(name = "IC_ATIVO", nullable = false, precision = 1, scale = 0)
    private boolean ativo = true;

    @Column(name = "NU_NIVEL", nullable = false, precision = 1, scale = 0)
    private Long nivel;

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

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

    public String getNome() {
        return perfilEnum.toString();
    }

    public boolean isAtivo() {
        return ativo;
    }
    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public Long getNivel() {
        return nivel;
    }

    public void setNivel(Long nivel) {
        this.nivel = nivel;
    }

    public PerfilEnum getPerfilEnum() {
        return perfilEnum;
    }

    public void setPerfilEnum(PerfilEnum perfilEnum) {
        this.perfilEnum = perfilEnum;
    }
}

當我檢索 Usuario 信息時,一切正常,但是當我調用方法getPerfil 時,由於關系的 ID,我收到 NoEntityFoundException。 數據只存在於常規表中,在審計表中數據不存在,因為審計表是在原始表中已經存在數據之后創建的,因此審計表上沒有記錄。 我只需要恢復 ID,不需要 Perfil 的數據。 所以,如果我調用getPerfil ,我唯一需要的就是 ID 信息。

有沒有人知道這種問題的解決方法或解決方案?

我需要這個的原因是因為一個 WEB 應用程序有一個屏幕顯示某些實體的變化,顯示值:date_created、property_changed、value_before 和 value_after。 因此,我正在構建邏輯以在 java 中手動比較修訂。

拜托,有人可以幫我嗎?

謝謝

您將需要對表進行本機 sql 查詢並提取 id。 您首先需要獲取修訂 ID(以進行查詢),然后重新請求數據(以使用本機查詢獲取必要的 ID)。

如果您在開始使用 Envers 之前有數據,您應該創建一個包含所有數據的初始“0”修訂版。

我遇到了類似的問題,唯一能幫助我的解決方案(變通方法)是在 envers 之前手動插入所有數據作為具有零時間戳 (1970-01-01) 的初始修訂版 1。 對於您的情況,它會是這樣的:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM