我正在寻找一种优雅的方式来完成下一个任务:
我有一个名为Ticket的实体,它有一些字段,如:owner,createdTs,body ....还有一个List实体,它将跟踪对故障单执行的所有更改。
我的应用程序是使用Strus2,Spring 3,Jpa + Hibernate构建的,我有一个服务类TicketService,其方法是save / updateTicket(票证)。
我试图实现一个方面@Before保存/更新方法但我的问题是我无法访问故障单的旧值以检测更改并根据这些更改创建TicketHistory对象。
我尝试了方面方法,因为我从许多其他方法访问此方法,现在这些对象(Ticket和TicketHistory)紧密耦合。
任何想法?
谢谢,
阿德里安
答案 0 :(得分:1)
由于您正在使用Hibernate,因此有一个非常好的声明性解决方案:
Envers(对于 En titiy Vers 离子)会自动检测使用@Audited
注释的实体的更改,并在数据库中创建历史记录。您甚至可以将自定义信息添加到修改中,例如进行更改的用户。
有关详细信息,请参阅Quickstart for Envers。
缺点是您必须更改一些代码,因为不再需要TicketHistory
。可以通过AuditReader类访问较旧的实体修订版。
另请注意,使用Envers时,您的程序直接依赖于Hibernate,而不仅仅是JPA。如果您想要更改持久性提供程序(并非经常发生这种情况),那么您还需要做更多的工作。