我们的应用程序正在使用Hibernate envers来提供有关实体更新的审核。每当修改(或插入)实体时,实体的备份(即表的行)都被保存到“AUD”表中。
这为我们提供了审核功能(这是一项要求),并且一直运作良好。但我们现在面临的问题是因为我们需要迁移到使用UUID作为数据键。我们的应用程序将在具有有限或间歇性Internet访问的分布式环境中运行,因此我们将使用SymmetricDS来管理数据同步,并且UUID将允许我们这样做而不会导致数据冲突。
我们遇到的Hibernate问题是,用于将REV号添加到AUD表中的RevisionNumber annotation只能用于int,Integer,long和Long标识符。
我们已经使用一些额外的属性实现了一个名为AuditRevision的类(它扩展了Hibernate类DefaultRevisionEntity),并实现了一个AuditRevisionListener(它实现了Hibernate的EntityTrackingRevisionListener)来管理保存和更新额外的数据。但是,为了允许我们使用UUID而不是自动递增ID来保存修订,我们重写了AuditRevision,以便它不会扩展DefaultRevisionEntity,而是定义自己的UUID id。
然后我们在应用程序中看到以下错误:
Caused by: org.hibernate.MappingException: The field annotated with @RevisionNumber must be of type int, Integer, long or Long
at org.hibernate.envers.configuration.internal.RevisionInfoConfiguration.searchForRevisionInfoCfgInProperties(RevisionInfoConfiguration.java:224)
at org.hibernate.envers.configuration.internal.RevisionInfoConfiguration.searchForRevisionInfoCfg(RevisionInfoConfiguration.java:304)
at org.hibernate.envers.configuration.internal.RevisionInfoConfiguration.configure(RevisionInfoConfiguration.java:347)
at org.hibernate.envers.configuration.spi.AuditConfiguration.<init>(AuditConfiguration.java:119)
at org.hibernate.envers.configuration.spi.AuditConfiguration.getFor(AuditConfiguration.java:180)
at org.hibernate.envers.event.spi.EnversIntegrator.integrate(EnversIntegrator.java:76)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:312)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
... 41 more
我们不确定如何继续。如果我们无法替换AuditRevision表的long主键以使用UUID id,我们可以将UUID(或其他id或键)添加到AuditRevision表中,然后将其与自动增量ID一起用作组合键。然后AUD表将需要引用UUID,我们认为我们可以使用数据库触发器管理UUID,因为我们无法控制AUD表。
另一个选择是我们也可以重写Hibernate envers库或派它们的代码并进行必要的修改以支持UUID。
有没有人有这个问题的经验?你会如何解决它?
我们正在使用Hibernate 4.3.7.Final和MySQL 5.7数据库