使用 JPA 和 Hibernate 实现组合键
2009-11-05 00:00:00 来源:WEB开发网清单 4 中的代码展示了从 PurchaseOrder 对象的实例化和设置一直到此对象在数据库中的持久化这个完整的过程。这实实在在地体现了 ORM 的魔力。让我们来看看发生了什么。
首先创建一个 EntityManagerFactory 的实例,随后使用此实例创建 EntityManager 的一个名为 em 的实例。后者随后用于将 PurchaseOrder 对象实例写入数据库。保持到数据库中的实际过程是在事务中完成的。
事务就是一组原子操作,可能全部成功完成,或在出现错误时回滚。如清单 4 所示,EntityManager 对象用于创建 EntityTransaction 的一个名为 tx 的实例。后面这个对象将工作单元打包到事务中。
请注意对 persist() 和 commit() 的调用。必须牢记,除非同时出现这两个调用,否则不能更改数据库。这是 Java 持久 API(JPA)的简单模式。
为了完成 ORM 之旅,图 1 展示了运行清单 4 中的代码之后数据库的状态。代码是使用称为 HSQLDB 的内存数据库测试的,这种产品包含一个简单的 GUI 工具。图 1 显示了 HSQLDB 数据库的状态。可以看到,我对 PURCHASE_ORDERS 表运行了 SQL 查询。该表是通过模式创建的,模式本身是使用本文前面给出的清单创建的。
图 1. 填充后的数据库
在图 1 中,可以看到清单 4 中的这行代码产生的效果:purchaseOrder.setItemName("My new computer")。对 setter 代码的调用使用 String 数据 “My new computer” 填充了数据库行中的相关列。就工作流而言,可认为整个程序都是在创建新计算机的购买订单时运行的,随后就是发票邮寄过程。工作流中的所有步骤都隐式地存储在数据库中。
结束语
清单 1 和清单 2 中定义的组合键允许您将多个列绑定在一起。列的组合能提供所需的唯一性,使您的数据库表中能拥有任意数量的行。我们已经介绍了如何实现这一目标。现在,您需要大致了解为什么要选择这种有些奇特的数据库设计方法。
使用组合键的最常见的原因或许就是为了向后兼容。换句话说,在您需要将新数据库代码整合到遗留环境中的时候。我认为,如今故意以这样一种方式设计数据库的做法并不常见,您只需要在符合惯例的场合创建组合键。
在这种情况下,我认为对于这种方法的讨论都是毫无意义的。如果组合键是标准,那么就不可能很快发生变化。在很多时候,都有大量现有数据是使用这种方法构造的。因而,如果组合键被数字键所取代,那么遗留数据就必须进行迁移。此外,也有许多业务流程是对应组合键数据的。所有这些因素结合在一起,使组合键成为一种必不可少的技术。
更多精彩
赞助商链接