2012-11-16 84 views
1

我需要一些關於Hibernate Envers的幫助。我有以下情形:Hibernate Envers - 審計實體無法從空的審計表關係中恢復ID

我有休眠/ 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中手動比較修訂版本。

請問誰能幫助我?

感謝

回答

0

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

+0

我有同樣的問題,你知道一種方式來產生'0'修訂? –

+0

只需將現有表中的所有數據複製到'0'修訂版。 – adamw

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;