我需要一些关于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中手动比较修订版。
拜托,有人可以帮助我吗?
由于
答案 0 :(得分:0)
如果在开始使用Envers之前有数据,则应创建一个包含所有数据的初始“0”修订版。
答案 1 :(得分: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;
答案 2 :(得分:0)
您将需要在表上进行本机sql查询并提取ID。您首先需要拉出修订版ID(以进行查询),然后重新请求数据(以使用本机查询来获取必需的ID)。