如何使用Hibernate Envers检索关系@ManyToOne的审计寄存器

时间:2014-04-06 15:38:16

标签: java hibernate hibernate-envers

我怀疑使用Hibernate Envers和我的班级。

我有一个班级Loja

@Entity
@Audited
@GenericGenerator(name = "Sequence_Generic", strategy = "com.paradigma.ecred.dao.hibernate.generator.ManualGenerator") // sequence generic criado para a atividade 510
@SelectBeforeUpdate @DynamicUpdate
public class Loja extends Persistent {

    @Trim
    @NotBlank(message = "O preenchimento do campo \"CNPJ\" é obrigatório.") 
    @CNPJ(message = "O \"CNPJ da loja\" é inválido")
    private String cnpj;

    @Trim
    @NotBlank(message = "O preenchimento do campo \"Razão social\" é obrigatório.")
    @Size(max = 255, message = "A Razão social deve conter no máximo {max} caracteres.")
    private String razaoSocial;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="idlojamaster", referencedColumnName = "id", columnDefinition="integer")   
    private Loja lojaMaster;

    @ManyToOne
    @JoinColumn(name="idseguradora", referencedColumnName = "id", columnDefinition="integer")   
    private Seguradora seguradora;

    @ManyToOne
    @JoinColumn(name="idTabelaSeguro", referencedColumnName = "id", columnDefinition="integer") 
    private TabelaSeguro tabelaSeguro;

    // getter e setter
}

我想知道审核字段lojaMasterseguradoratabelaSeguro。这些类标有@Audited。当我执行insertedit之类的操作时,Id表中存储了loja_aud值区域。但是,当我在Eclipse com.sun.jdi.InvocationException中进行调试时,我将表格中的这些值重新转换为鞋子。

它通过Hibernate执行sql,但该类仍为null,我在这些类中找到了一个方法handler。它包含我的对象的id

我试图找到信息,但这非常困难。

所以有人可以帮助我!

2 个答案:

答案 0 :(得分:1)

我有同样的问题,在我的情况下,我开始审核已填充的数据库。当我使用空数据库时,一切正常。我从this

获取信息

答案 1 :(得分:1)

我找到了一种处理我的问题的方法。

我正在调试我的代码,并在这些实体lojaMasterseguradoratabelaSeguro内部找到一个名为handler的方法。我的问题是,该系统是在较旧的数据库中开发的。因此,Envers不会在aud table中找到这些实体,也找不到。

在此图片中,您可以看到,处理程序是proxy object并且id的{​​{1}}。

Eclipse Debug

所以我开始尝试找到一种获得此object的方法。因此,当我理解这是Id我在Google中找到的解决方案Hibernate时,Hibernate会将此视为一种无法获取对象的所有内容的策略。

所以我得到了代码,并获得了id。

proxy object

所以我得到并检查我​​的实体public Serializable getIdentifier(Object object) { if (!(object instanceof HibernateProxy) || Hibernate.isInitialized(object)) { return ((Persistent)object).getId(); } HibernateProxy proxy = (HibernateProxy) object; LazyInitializer initializer = proxy.getHibernateLazyInitializer(); return initializer.getIdentifier(); } 是否为Id。我收到了ID,null findById。我每次访问object时都创建了一个hashmap,因为database可以重复。

所以这些方法都是这样的

ids

我希望这可以帮助有@Override public List<Pojo> getLog(Pojo pojo) { Map<Long, Loja> mapLoja = new HashMap<>(); Map<Long, Seguradora> mapSeguradora = new HashMap<>(); Map<Long, TabelaSeguro> mapTabelaSeguro = new HashMap<>(); List<Pojo> auditedList = super.getLog(pojo); if (!NullUtil.isNull(auditedList)) { for (Pojo pojoAudited : auditedList) { Long id = null; if (NullUtil.isNull(pojoAudited.getLojaMaster().getId())) { id = (Long) this.getIdentifier(pojoAudited.getLojaMaster()); this.getLojaRegister(mapLoja, id); pojoAudited.setLojaMaster(mapLoja.get(id)); } if (NullUtil.isNull(pojoAudited.getSeguradora().getId())) { id = (Long) this.getIdentifier(pojoAudited.getSeguradora()); this.getSeguradoraRegister(mapSeguradora, id); pojoAudited.setSeguradora(mapSeguradora.get(id)); } if (NullUtil.isNull(pojoAudited.getTabelaSeguro().getId())) { id = (Long) this.getIdentifier(pojoAudited.getTabelaSeguro()); this.getTabelaSeguroRegister(mapTabelaSeguro, id); pojoAudited.setTabelaSeguro(mapTabelaSeguro.get(id)); } } } return auditedList; } private void getLojaRegister(Map<Long, Loja> mapLoja, Long id) { if (!mapLoja.containsKey(id)) { Loja loja = this.findById(id); mapLoja.put(id, loja); } } private void getSeguradoraRegister(Map<Long, Seguradora> mapSeguradora, Long id) { if (!mapSeguradora.containsKey(id)) { Seguradora seguradora = this.getSeguradoraService().findById(id); mapSeguradora.put(id, seguradora); } } private void getTabelaSeguroRegister(Map<Long, TabelaSeguro> mapTabelaSeguro, Long id) { if (!mapTabelaSeguro.containsKey(id)) { TabelaSeguro tabelaSeguro = this.getTabelaSeguroService().findById(id); mapTabelaSeguro.put(id, tabelaSeguro); } } 及更旧数据库问题的人。