使用 JPA 和 Hibernate 实现组合键
2009-11-05 00:00:00 来源:WEB开发网清单 2 中的下一个注释是 @IdClass,它定义组合键类引用。您可能已经注意到了,该类引用清单 1 中的 BillingAddress 类。跳过清单 2 中的构造方法,注意 @Id 注释。组合键就是在这里使用嵌套 @AttributeOverrides 注释定义的。这些注释用于定义组合键列:分别是 “STREET” 和 “CITY”。
就在清单 2 的注释之后,您是否看到了来自清单 1 的两行重复的代码?当然,重复的代码是表示街道和城市的两个私有数据成员。这样的重复是创建组合键所必需的。
数据库模式
至此讨论的内容都是技术层面上的。现在我们将以更加具体的方式表述此技巧,我们将生成一个数据库模式。清单 3 展示了来自这个非常简单的 ORM 数据库设计的模式。
清单 3. 数据库模式drop table PURCHASE_ORDERS if exists;
create table PURCHASE_ORDERS (
street varchar(255) not null,
city varchar(255) not null,
itemName varchar(255),
primary key (street, city)
);
可以看到,主键实际上是由 street 和 city 字段组合而成的。在真实的数据库中 — 例如,带有图形用户界面(GUI)工具的数据库中,这将得到怎样的效果?在给出答案之前,我编写了一段简单的客户端代码,用于将一个或两个实体保持到数据库中。
清单 4 展示了一段代码摘录,实例化上文所定义类的对象。
清单 4. ORM 客户端代码摘录 // Start EntityManagerFactory
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("helloworld");
// First unit of work
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
PurchaseOrder purchaseOrder =
new PurchaseOrder(new BillingAddress("Broad Street", "Boston"));
purchaseOrder.setItemName("My new computer");
em.persist(purchaseOrder);
tx.commit();
em.close();
更多精彩
赞助商链接