持久化实体
使用 OpenJPA 持久化实体的继承关系时,开发者只需要按照面向对象的思想操纵实体即可,无需为实体的继承关系作多余的工作。下面的章节中我们将了解持久化实体 Animal、Fish、Dog 时开发者需要完成的工作以及 OpenJPA 转化后在关系数据库中的实现细节。
持久化 Animal
我们可以使用下面的代码段来持久化一个新的 Animal 对象:
2. EntityManagerFactory factory = Persistence.createEntityManagerFactory(
3. "jpa-unit", System.getProperties());
4.
5. // 从 EntityManagerFactory 中创建 EntityManager
6. EntityManager em = factory.createEntityManager();
7.
8. // 开始持久化实体的事务
9. em.getTransaction().begin();
10.
11. // 使用相同的方式持久化实体
12. em.persist(new Animal(1,"honey"));
13.
14. // 提交持久化实体的事务
15. em.getTransaction().commit();
16.
17. // 关闭EntityManager
18. em.close();
当我们执行这段代码时,OpenJPA 会将它转化为关系数据库对应的 SQL 语句:
[注] 如果您还不知道如何使用 OpenJPA 持久化对象,请阅读 本系列 前面的文章,了解 OpenJPA 开发的基本知识。
持久化 Fish
Fish 对象的持久化和 Animal 实体的持久化过程没有任何的不同,只不过 persist 方法的参数变成了 Fish 对象。我们可以使用下面的代码段来持久化一个新的 Fish 对象,请注意下面代码中加粗的部分。
2. EntityManagerFactory factory = Persistence.createEntityManagerFactory(
3. "jpa-unit", System.getProperties());
4.
5. // 从 EntityManagerFactory 中创建 EntityManager
6. EntityManager em = factory.createEntityManager();
7.
8. // 开始持久化实体的事务
9. em.getTransaction().begin();
10.
11. // 使用相同的方式持久化实体
12. em.persist(new Fish(2,"mermaid","SEA"));
13.
14. // 提交持久化实体的事务
15. em.getTransaction().commit();
16.
17. // 关闭EntityManager
18. em.close();
由于 Fish 对象的属性保存在两个表中,因此当我们执行这段代码时,OpenJPA 会将它转化为对应的两条 SQL 语句:
INSERT INTO Animal (id, name) VALUES (2, 'mermaid')
INSERT INTO Fish (id, territory) VALUES (2, 'SEA')
持久化 Dog
持久化 Dog 对象和持久化 Fish 对象的过程几乎一样,区别是 persist 方法的参数变成了 Dog 对象。
em.persist(new Dog(3,"ba guai","MALE"));
和持久化 Fish 对象时一样,Dog 对象的属性也保存在两个表中,因此当我们执行这段代码时,OpenJPA 会将它转化为对应的两条 SQL 语句:
INSERT INTO Animal (id, name) VALUES (3, 'ba guai')
INSERT INTO Dog (id, sex) VALUES (3, 'MALE')
从数据库中查询实体对象
在上一章节中我们了解了如何持久化存在继承关系的实体内,并且介绍了 OpenJPA 在处理继承关系时的细节行为,接下来我们将介绍如何从数据库中获取实体,以及 OpenJPA 在这个过程中对于继承关系处理的细节。