持久化模式,第 1 部分: 现代 ORM 工具的策略和最佳实践
2010-04-02 00:00:00 来源:WEB开发网生硬的方式:在需要修改审计信息的对象的任何地方,都确保用正确的值填充审计信息。这种方式有许多明显的缺陷。最主要的缺陷是,审计逻辑会在应用程序中的许多地方重复出现。即使把这一逻辑集中在一个实用程序类中,仍然必须记住在修改对象的每个地方使用这个实用程序 — 不只是在最初开发系统时,在维护系统时也必须牢记这一点。但是,在任何规模的系统中,开发人员或早或晚都会忘记这项要求。
把审计逻辑放在 DAO 中:另一种方式是把审计逻辑集中在一个通用 DAO 中。通过在保存方法中添加审计逻辑,使用这个 DAO 保存的任何对象都会自动填充审计字段。这种方式在许多情况下效果很好,但是仍然有一些缺陷。一个缺陷是,这种方式假设应用程序总是使用通用 DAO 的保存方法来保存数据。但是,实际情况不一定总是这样的,那么前面的问题就又出现了:必须记住添加审计逻辑。另一个问题更严重:这个解决方案忽略了 ORM 工具最有用的特性之一,过渡持久化(transitive persistence)。可以使用 DAO 显式地保存 Employee 对象,但是 Hibernate 也会自动地对与它相关联的 Address 的任何修改进行持久化。在这种情况下,Employee 会填充它的审计字段,但是 Address 不会。
Hibernate 的 Interceptor :为了解决这个问题,需要在 Hibernate 中建立一个扩展点。每当框架保存对象时,需要在一个地方填充这些审计字段。Hibernate 通过它的 Interceptor 接口提供了这个特性。这个接口为许多 Hibernate 事件提供回调方法,包括创建、修改和删除对象。把审计逻辑放在 Hibernate 的 Interceptor 中,就可以消除重复的逻辑,而且不再需要为确保执行逻辑操心。只要由 Hibernate 负责保存数据,就一定会执行审计逻辑。
更多精彩
赞助商链接