2

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 でリビジョンを手動で比較するロジックを構築しています。

お願いします、誰か助けてくれませんか?

ありがとう

4

3 に答える 3

-1

Enversの使用を開始する前にデータがあった場合は、そのすべてのデータを含む最初の「0」リビジョンを作成する必要があります。

于 2012-11-21T19:37:48.243 に答える