技术开发 频道

实体继承

  获取所有 Animal 对象

  我们通过 OpenJPA 中的 Query 接口和 JPQL(Java Persistence Query Language)语言来获取数据库中的记录并且转换为相应的 Java 对象,因此开发者只需要处理 Java 对象模型即可。下面的代码可以从数据库中获取所有的 Animal 对象,请注意其中粗体的部分。

1 1.    // 通过 Persistence 创建 EntityManagerFactory
2 2.    EntityManagerFactory factory = Persistence.createEntityManagerFactory(
3 3.            "jpa-unit", System.getProperties());
4 4.    // 创建新的 EntityManager
5 5.    EntityManager em2 = factory.createEntityManager();
6 6.    
7 7.    // 查询所有 Animal 对象
8 8.    Query q = em2.createQuery("select m from Animal m");
9 9.    
10 10.    // 直接处理 Animal 对象,打印 Animal 对象的信息
11                 
12 11.    for (Animal m : (List<Animal>) q.getResultList()) {
13                 
14 12.        System.out.println("Animal Object:");
15                 
16 13.        System.out.println("  id:" + m.getId());
17                 
18 14.        System.out.println("  name:" + m.getName());
19                 
20 15.    }
21 16.    
22 17.    // 关闭 EntityManager 和 EntityManagerFactory
23 18.    em2.close();
24 19.    factory.close();
25

  当我们执行这段代码时,OpenJPA 会将它转化为关系数据库对应的 SQL 查询语句:

1 SELECT t0.id, t1.id, t2.id, t0.name, t1.sex, t2.territory
2 FROM Animal t0
3 LEFT OUTER JOIN Dog t1 ON t0.id = t1.id
4 LEFT OUTER JOIN Fish t2 ON t0.id = t2.id
5

  在查询结果返回后,OpenJPA 会将查询结果影射到相关的 Animal 对象上,整个过程是透明的,开发者只需要处理对象模型即可。

  获取所有 Fish 对象

  Fish 对象的获取和 Animal 对象的获取在 OpenJPA 中大同小异,唯一的区别是使用 JPQL 不相同,查询 Fish 对象时使用“select fish from Fish fish”。下面的代码可以从数据库中获取所有的 Fish 对象,请注意其中粗体的部分。

1.    // 通过 Persistence 创建 EntityManagerFactory
2.    EntityManagerFactory factory = Persistence.createEntityManagerFactory(
3.            "jpa-unit", System.getProperties());
4.    // 创建新的 EntityManager
5.    EntityManager em2 = factory.createEntityManager();
6.    
7.    // 查询所有 Fish 对象
8.    Query q1 = em2.createQuery("select fish from Fish fish");
9.    
10.    // 打印 Fish 对象的信息
11.    for (Fish fish : (List<Fish>) q1.getResultList()) {
12.        System.out.println("Fish Object:");
13.        System.out.println("  id:" + fish.getId());
14.        System.out.println("  name:" + fish.getName());
15.        System.out.println("  territory:" + fish.getTerritory());
16.    }
17.    
18.    // 关闭 EntityManager 和 EntityManagerFactory
19.    em2.close();
20.    factory.close();

  当我们执行这段代码时,OpenJPA 会将它转化为关系数据库对应的 SQL 查询语句:

1 SELECT t1.id, t0.id, t1.name, t0.territory
2 FROM Fish t0
3 INNER JOIN Animal t1 ON t0.id = t1.id
4

  在查询结果返回后,OpenJPA 会将查询结果影射到相关的Fish对象上,整个过程是透明的,开发者只需要处理对象模型即可。

  获取所有 Dog 对象

  获取 Dog 对象的过程和获取 Fish 对象的过程一致,开发者只需要将 Query 接口使用的 JPQL 语句改为“select dog from Dog dog”。

1 Query q1 = em2.createQuery("select dog from Dog dog ");
2

  当我们执行这段代码时,OpenJPA 会将它转化为关系数据库对应的 SQL 查询语句:

1 SELECT t1.id, t0.id, t1.name, t0.sex
2 FROM Dog t0
3 INNER JOIN Animal t1 ON t0.id = t1.id
4

  在查询结果返回后,OpenJPA 会将查询结果影射到相关的Fish对象上,整个过程是透明的,开发者只需要处理对象模型即可。

  总结

  对象继承关系在关系数据库中的表现是对象持久化中难于实现的部分,OpenJPA 为开发者提供了一种透明的实现。在 OpenJPA 中提供了 SINGLE_TABLE、JOINED 和 TABLE_PER_CLASS 三种实现方式处理实体继承关系,开发者需要做的仅仅是为实体类提供 javax.persistence.Inheritance 注释,同时设置它的 strategy 属性,确定使用哪种对象继承关系即可,和关系数据库交互的部分由 OpenJPA 框架完成。

  相关代码下载:OpenJPAExamples2.zip

0
相关文章