我正在开发一个spring-hibernate-envers应用程序.很多谷歌搜索后的东西终于为我工作,但我仍然有几个问题.
早些时候我saveOrUpdate用于保存或更新实体.但是当与envers合作时,它会抛出nonUniqueObject
异常.所以我使用了merge而且它有效.为此使用合并是否正确?是否merge将新对象插入db?
我试过以下代码:
Run Code Online (Sandbox Code Playgroud)entity=merge(entity); saveOrUpdate(entity);
这也有效.这是正确的方法吗?而且我很好奇为什么saveOrUpdate现在不抛出任何错误.
我是 hibernate envers 的新手。我已成功为每个实体创建了审计表。但我不知道如何为每个实体读取这些历史记录。我想在 jsp 中显示此历史记录。我想阅读该特定的所有历史记录实体。任何机构都知道如何做到这一点。
我已经开始使用 Hibernate Envers 来审计日志记录业务对象。我已阅读文档,并且从我看到的所有示例中,查询是通过修订号完成的。
我想按修订日期查询,即获取在特定日期或日期范围内发生的已审核实体的所有行。我这样的事可能吗?
我的 revinfo 表包含一个时间戳,所以我知道数据在那里。
我正在使用Spring 4.0.2开发一个使用JPA 2.1(由hibernate 4.2.11支持)的应用程序.我们使用Envers审核项目实体的变更.这工作正常.当我们尝试使用自定义修订实体作为Envers文档说:http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#envers-revisionlog时出现问题
我们已经在文档中指出了一个自定义类和一个自定义监听器,但似乎Hibernate完全忽略了它们.自定义类:
@Entity
@RevisionEntity(AuditingRevisionListener.class)
public class AuditedRevisionEntity extends DefaultRevisionEntity {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public class AuditingRevisionListener implements RevisionListener {
private static Log log = LogFactory.getLog(AuditingRevisionListener.class.getName());
@Override
public void newRevision(Object revisionEntity) {
AuditedRevisionEntity revEntity = (AuditedRevisionEntity) revisionEntity;
String userName = SecurityContextHolder.getContext().getAuthentication().getName();
revEntity.setUsername(userName);
}
}
Run Code Online (Sandbox Code Playgroud)
就像hibernate没有考虑这个类一样,因为它应该足以让它使用注释:@RevisionEntity(AuditingRevisionListener.class).其他带注释的实体已得到很好的认可,但这只是被忽略了.我们在spring config中(我们不使用persistence.xml)在加载spring上下文时要扫描的基础包:
<context:component-scan base-package="our.basepackage" />
Run Code Online (Sandbox Code Playgroud)
这够了吗?
我们还尝试了另一种方法.在EntityManagerFactory配置中使用此属性手动设置修订侦听器
<prop key="org.hibernate.envers.revision_listener">our.basepackage.AuditingRevisionListener</prop>
Run Code Online (Sandbox Code Playgroud)
但是我们在newRevision方法的第一行得到了classcastexception,因为参数revisionEntity不是AuditedRevisionEntity类.再次就像没有加载AuditedRevisionEntity类.
我提出这是一个简单的问题,但我无法猜测为什么@RevisionEntity注释被忽略了.任何的想法?
我有2个Maven项目在各自的POM中共享一个JPA项目作为依赖项。JPA项目在2.1版上,并且成功实现了休眠envers。但是,现在我需要创建一个自定义的RevisionEntity,因为我需要审核其他属性,例如登录的用户ID。问题是:
一世。我不能在JPA项目中直接实现
ii。父maven项目的检索登录用户的实现不同。
真正的挑战实际上是实现RevisionListener。我尝试在JPA项目本身中创建一个抽象类的修订侦听器,可以在每个父Maven项目中扩展和实现它。大声笑!这没用!
无论如何,我将不胜感激。有出路吗?
使用Hibernate Envers我希望通过其ID获取实体的所有实体,修订号,修订日期和修订类型.
目前我这样做是为了获取实体,修订号和修订日期:
public List<Alumno> obtenerAuditoriaAlumno(Long idAlumno) {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> revisionNumbers = auditReader.getRevisions(Alumno.class, idAlumno);
List<Alumno> auditoriaAlumno = new ArrayList<Alumno>();
for (Number rev : revisionNumbers) {
Alumno alumno = auditReader.find(Alumno.class, idAlumno, rev);
Date revisionDate = auditReader.getRevisionDate(rev);
alumno.setRevisionNumber(rev.intValue());
//alumno.setRevisionType(revisionType); // GET THIS
alumno.setRevisionDate(revisionDate);
auditoriaAlumno.add(alumno);
}
return auditoriaAlumno;
}
Run Code Online (Sandbox Code Playgroud)
是否可以通过一个查询获得它?
我应该将这些字段直接添加到实体吗?
我现在真的有一个奇怪的问题。
我只想删除一个实体。
我也在使用 Hibernate envers 进行审计。所以现在我想删除这个实体。
现在我收到以下消息。
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列“成功”不能为空
因此,当我@Audit突然从表中删除时,我能够删除该实体。
现在我去了我的 entity_aud 表并取消选择 NOT NULL 属性成功。然后我也再次放在@Audit我的桌子上方。
现在它起作用了。那么为什么如果我只想删除一个实体,我在使用 Hibernate Envers 时会收到 NOT NULL 错误。
这是什么原因。
我没有使用envers很长时间,我遇到了一个问题,我似乎无法找到任何地方的答案.我试过谷歌搜索堆栈跟踪,但无济于事,所以我必须错过一些令人目眩的明显.每当我尝试在org.hibernate.envers.AuditReader中运行'find(class,versionNumber)'方法时,我似乎得到以下堆栈跟踪,以便在数据库中检索以前版本的Document类:
java.lang.NullPointerException
org.hibernate.envers.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:91)
org.hibernate.envers.entities.EntityInstantiator.addInstancesFromVersionsEntities(EntityInstantiator.java:113)
org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:110)
org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:108)
org.hibernate.envers.reader.AuditReaderImpl.find(AuditReaderImpl.java:119)
org.hibernate.envers.reader.AuditReaderImpl.find(AuditReaderImpl.java:94)
com.example.repository.AbstractDocumentTypeManager.getVersion(AbstractDocumentTypeManager.java:221)
com.example.repository.AbstractDocumentTypeManager.getVersion(AbstractDocumentTypeManager.java:1)
com.example.logic.versioning.BaseVersioningService.getApprovedSnapshot(BaseVersioningService.java:54)
com.example.logic.versioning.BaseVersioningService$$FastClassByCGLIB$$d33887d.invoke(<generated>)
net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
...
Run Code Online (Sandbox Code Playgroud)
导致此错误的代码如下.它发生在我的文档保存后,似乎在数据库中创建了适当的版本(document_AUD).
public Document getVersion(String objectId, Number version) {
AuditReader auditReader = getAuditReader();
/* at this point, i guarantee that neither objectId nor version are null. */
Document revision = auditReader.find(Document.class, objectId, version);
return revision;
}
public AuditReader getAuditReader() {
return AuditReaderFactory.get(entityManager);
}
Run Code Online (Sandbox Code Playgroud)
我的'文档'类注释如此......
@Entity(name = "document")
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING)
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@Cacheable(true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "modelObjectCache")
public abstract class Document<T …Run Code Online (Sandbox Code Playgroud) AuditQuery query = auditReader.createQuery()
.forRevisionsOfEntity(AB.class, false, true)
.add(AuditEntity.property("bId").eq(bId))
.addOrder(AuditEntity.revisionNumber().desc());
Run Code Online (Sandbox Code Playgroud)
上面的代码检索所有修改除了RevType DEL修订版bId列null.
我有三个表A,B和AB.ABtable是一个关系表.所以AB表中有abID作为PK,和aId,bID修订信息.每当B删除时,它都会更新AB_AUDv table with revtypeDEL and keeps援助,出价asnull`.
要显示已删除的内容B,是否有人可以通过修改后的审核查询器建议我?
我使用@Audited annotation作为我的基本模型.我为所有实体扩展了它.但它不起作用.有什么方法我可以使用它
这是我的基本模型
@MappedSuperclass
@Getter
@Setter
@Audited
public abstract class BaseModelObject implements Serializable {
/**
*
*/
private static final long serialVersionUID = 4194525198831057382L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
protected Long id;
}
Run Code Online (Sandbox Code Playgroud)
这是我的模特课
@Entity
public class City extends BaseModelObject {
private static final long serialVersionUID = 1L;
@Column
private String name;
}
Run Code Online (Sandbox Code Playgroud)