我怀疑使用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
}
我想知道审核字段lojaMaster
,seguradora
,tabelaSeguro
。这些类标有@Audited
。当我执行insert
或edit
之类的操作时,Id
表中存储了loja_aud
值区域。但是,当我在Eclipse
com.sun.jdi.InvocationException
中进行调试时,我将表格中的这些值重新转换为鞋子。
它通过Hibernate执行sql,但该类仍为null,我在这些类中找到了一个方法handler
。它包含我的对象的id
。
我试图找到信息,但这非常困难。
所以有人可以帮助我!
答案 0 :(得分:1)
我有同样的问题,在我的情况下,我开始审核已填充的数据库。当我使用空数据库时,一切正常。我从this
获取信息答案 1 :(得分:1)
我找到了一种处理我的问题的方法。
我正在调试我的代码,并在这些实体lojaMaster
,seguradora
和tabelaSeguro
内部找到一个名为handler的方法。我的问题是,该系统是在较旧的数据库中开发的。因此,Envers
不会在aud table
中找到这些实体,也找不到。
在此图片中,您可以看到,处理程序是proxy object
并且id
的{{1}}。
所以我开始尝试找到一种获得此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);
}
}
及更旧数据库问题的人。