@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();
Run Code Online (Sandbox Code Playgroud)
为什么同时使用?使用两者还是足够好?
在Hibernate Envers中,无论设置了哪种获取类型,都会延迟加载实体的所有相关集合.因此,当审计具有其他实体集合的实体(当然都是经过审计)时,该集合SetProxy最初是(在调试时可以看到).
那么,我该如何初始化该代理呢?使用Hibernate.initialize()没有效果(我怀疑是因为Hibernate和Envers使用不同的代理对象).我知道我可以通过迭代它的项目来初始化集合,但这对我来说不是一个选项,因为我在一个实体中有多个集合,更不用说维护问题了.
我需要急切地初始化它们,因为我在Hibernate会话已经关闭的时候访问该集合(将域对象转换为dtos).
我正在使用Hibernate 3.5.6.
我使用Hibernate Envers来审核我的实体.
我有一个经审计的实体,Foo它有一个List<Bar>属性.但是,我不想审核Bar实体.因此,我写道:
@Entity
@Audited
public class Foo {
@JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID"))
@ManyToMany(cascade = PERSIST)
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
public List<Bar> getBars() {
return bars;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想要检索以下版本Foo:
AuditReader reader = AuditReaderFactory.get(getEntityManager());
Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult();
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我想要检索所有数据时(即延迟加载时bars),我得到错误ORA-00942: table or view does not exist,因为它试图查询:
select ... from T_FOO_BAR_AUD x, T_BAR y where ...
Run Code Online (Sandbox Code Playgroud)
我虽然使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED),Hibernate …
我正在为现有的hibernate实体添加envers.到目前为止,审计工作一切顺利,但查询是一个不同的问题,因为修订表没有填充现有数据.还有其他人已经解决了这个问题吗?也许您已经找到了一些方法来使用现有表填充修订表?我想我会问,我相信其他人会发现它很有用.
我正在尝试设置Hibernate Envers以使用我的Spring Boot应用程序.
我已经包含了Envers依赖项并添加了@Audited注释,它工作正常,但我无法配置特定的Envers属性,Spring Boot似乎没有接受它们.
具体来说,我试图通过将这些设置为application.properties来为审计表设置不同的数据库模式,但没有运气:
hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)
要么
org.hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)
要么
spring.jpa.hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)
这些都不奏效.有谁知道如何设置这些?
编辑.
正如M. Deinum建议我尝试的那样:
spring.jpa.properties.org.hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)
它工作了!
我需要在我的grails web app中为文章实现修订系统.在搜索grails论坛,stackoverflow,grails插件和谷歌搜索互联网后,我最终得到了3个选项:
选项1 - 使用grails Envers插件(请参阅http://code.google.com/p/grails-envers-plugin/).有没有人成功使用它?或者在没有插件的情况下使用Envers(请参阅此处),但如何使其与GORM一起使用?
选项2 - 使用Gvers插件我在这里找到:https://github.com/ziftytodd/gvers.我从来没有听过有人使用它,所以有没有人曾经成功使用它?
选项3 - 内置机制.Weceem为Weceem CMS的任何内容创建了版本控制系统.我可以从代码的逻辑和这个伟大的应用程序的设计中汲取灵感,但它似乎有点矫枉过正,我不喜欢使用非标准的解决方案.
所以我的问题是,你建议我做什么?你有没有使用过这些选项?
非常感谢您的见解.
我们使用Hibernate envers来存储数据的历史修订版,需要将数据恢复到某个修订版.由于我们使用Version列来使用乐观锁定方法,当我尝试从先前版本保存数据时,我得到了一个StaleObjectException.有没有办法强制Hibernate存储以前版本的数据?
我正在考虑从自我实现的版本控制解决方案切换到Hibernate Envers,但我还不太确定.我已经阅读了很多关于它的内容,但我关注架构更改以及Envers在根据旧架构历史化数据后如何处理它们.
您在这方面与Envers有什么经历?如何使用Envers处理架构更改和现有数据?
更新1:
它不只是添加从表中删除简单列,而是例如将简单的Forein-Key-Relationship更改为具有两个1:n关系的单独实体(M2M与属性列.这是您的"逻辑"更改当使用Envers时,如果根据旧模型已经存在历史数据,那么如何处理?有没有其他方法可以手动编写sql脚本并将它们转移到新的表示中?
java hibernate database-migration database-schema hibernate-envers
我有一个相当复杂的数据库结构,我正在尝试审核.目前我运行Envers并审核对每个对象所做的更改.这非常有效!
我现在想在UI上显示一些审计信息.对象/表格变得非常复杂,因此我一直在寻找一种方法来查看审计中哪些字段已更改.当前Envers存储标记有修订ID的每个对象的快照.我可以查看每个对象的修订版,然后手动查询以查看已更改的内容,但我想知道是否有一种方法可以Envers存储哪些字段已更改.这可能吗?我从2011年发现了这个链接,它建议手动检查每个对象字段.我关心的是速度.我有很多相关的对象,我可能只有一个更新的字段.我将不得不查询很多字段以找到已更改的字段.
是否可以存储已更改的字段?
谢谢
编辑
我应该说我正在使用REVCHANGES表,所以我可以看到在什么版本中发生了什么变化但是这只是在实体级别而不是字段级别
我有一个经典的继承持久化实体Parent和Child,其中Child扩展Parent.类Parent是抽象的,而Child不是.
我想审核孩子.这个实体在我的控制之下,而Parent则不在.此外,它还有许多其他不需要审计的子类.整个层次结构的继承策略是JOINED.
所以我用@Audited注释了Child,另外还有@AuditOverride(forClass = Parent.class).
我得到的是这个错误:
"org.hibernate.MappingException:实体'Child'被审计,但是它的超类:'Parent'不是."
顺便说一下,我正在使用envers 4.0.1.Final版本.
有谁知道我怎么能做到这一点? 我试图消除@Audited在儿童类,除去@AuditOverride,使用过时auditParents在@Audited注释,但似乎没有任何工作.
这是Parent实体:
@Entity
@Table(name = "parent")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type")
public class Parent {
public Parent() {
super();
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "base_id", unique = true, nullable = false)
private …Run Code Online (Sandbox Code Playgroud) hibernate ×10
hibernate-envers ×10
java ×8
audit ×1
auditing ×1
grails ×1
jpa ×1
lazy-loading ×1
proxy ×1
spring ×1
spring-boot ×1
versioning ×1