技术开发 频道

使用ApacheOpenJPA开发EJB 3.0 : 实体关联

        级联新建对象

  下面的这段代码演示了只需要调用 Book 类的 persist 方法就同时持久化 Book 类对象和 BookExtend 类对象的情况。请注意其中用粗体标识出的部分。

1 /* 获得 EJB 的实体管理器 */
2 EntityManagerFactory emf = Persistence.createEntityManagerFactory(null);
3 EntityManager em = emf.createEntityManager(PersistenceContextType.EXTENDED);
4 /* 开始事务 */
5 em.getTransaction().begin();
6
7 /* 创建新的 BookExtend 对象 */
8 BookExtend bookExtend = new BookExtend();
9 /* 设置对象属性 */
10 bookExtend.name = "前言 本书重点说明了...";
11 /* 创建新的 Book 对象 */
12 Book book = new Book();
13 /* 设置 Book 对象的 name 属性 */
14 book.name = "<<Web Services实践>>";
15 /* 建立对象之间的关系 */
16 book.bookExtend = bookExtend;
17
18 /* 持久化对象,只需要持久化 Book 对象,不需要单独持久化 bookExtend 对象 */
19 em.persist(book);
20
21 /* 结束事务 */
22 em.getTransaction().commit();
23 em.close();
24 emf.close();
25

  产生的 SQL 语句

  下面的这段 SQL 语句是运行上面的代码时 OpenJPA 自动生成的,我们可以从中看到 OpenJPA 级联新建对象时的处理过程:

1 -- 创建 Book 实体对应的数据库表 --
2 CREATE TABLE Book (ID INTEGER NOT NULL AUTO_INCREMENT, NME VARCHAR(255),
3     extendID INTEGER, PRIMARY KEY (ID));
4 -- 创建 BookExtend 实体对应数据库表 --
5 CREATE TABLE BookExtend (ID INTEGER NOT NULL AUTO_INCREMET,
6     NAME VARCHAR(255), PRIMARY KEY (ID)) ;
7 -- 将 Book 实体对象插入数据库中 --
8 INSERT INTO Book (NAME) VALUES (‘<<Web Services实践>>’)
9 -- 获取 Book 实体对象的编号 --
10 SELECT LAST_INSERT_ID();
11 -- 将 BookExtend 实体对象插入数据库中 --
12 INSERT INTO BookExtend (NAME) VALUES (‘前言 本书重点说明了...’) ;
13 --获取 BookExtend 实体对象的编号  --
14 SELECT LAST_INSERT_ID();
15 -- 将 BookExtend 实体对象的编号更新到Book表中形成关联关系 --
16 UPDATE Book SET extendID = 1 WHERE ID = 1;
17

  级联更新对象状态

  下面的这段代码演示了只需要调用 Book 类的 merge 方法就同时更新 Book 类对象和 BookExtend 类对象状态的情况。请注意其中用粗体标识出的部分。

1 /* 获得 EJB 的实体管理器 */
2 EntityManagerFactory emf = Persistence.createEntityManagerFactory(null);
3 EntityManager em = emf.createEntityManager(PersistenceContextType.EXTENDED);
4 /* 开始事务 */
5 em.getTransaction().begin();
6         
7 /* 创建新的 Book 对象 */
8 Book book = new Book();
9 /* 设置 Book 对象的 id 属性 */
10 book.id= 1;
11 book.name = “OpenJPA入门”;
12 /* 创建新的 BookExtend 对象 */
13 BookExtend bookExtend = new BookExtend();
14 /* 设置对象属性 */
15 bookExtend.id=1;
16 bookExtend.name = "OpenJPA开发EJB3.0应用 ...";
17 /* 建立对象之间的关系 */
18 book.bookExtend = bookExtend;
19
20 /* 持久化对象,只需要调用 Book 对象的 merge 方法,不需要单独处理 bookExtend 对象 */
21 em.merge(book);
22
23 /* 结束事务 */
24 em.getTransaction().commit();
25 em.close();
26 emf.close();
27

  级联删除对象

  下面的这段代码演示了只需要通过 Query 对象,就可以在删除 Book 类的同时,删除它对应的 BookExtend 实体对象的情况。请注意其中用粗体标识出的部分。

1 /* 获得 EJB 的实体管理器 */
2 EntityManagerFactory emf = Persistence.createEntityManagerFactory(null);
3 EntityManager em = emf.createEntityManager(PersistenceContextType.EXTENDED);
4 /* 开始事务 */
5 em.getTransaction().begin();
6 /* 使用查询删除对象,可以不必将对象加入到内存中,提高效率 */
7 Query q = entityManager.createQuery("delete from Book c WHERE c.id=:id");
8 int id = book.id;
9 /* 设置被删除 Book 对象的主键值 */
10 q.setParameter("id", id);
11 /* 当方法被调用时,Book 对象对应的 BookExtend 对象会同时被删除 */
12 q.executeUpdate();
13
14 /* 结束事务 */
15 em.getTransaction().commit();
16 em.close();
17 emf.close();
18

  其它几种关联关系

  在上面的文章中我们学习了如何在 OpenJPA 中通过 javax.persistence.OneToOne 注释和 javax.persistence.JoinColumn 注释实现实体之间的一对一关联关系。在企业应用中,除了一对一关联关系,实体之间还可能存在一对多、多对一、多对多等关联关系,不过在 OpenJPA 容器中,这些实体之间关联关系的实现都大同小异,只是需要开发者选择使用不同的注释。

  开发者用来描述实体之间一对多关联关系的注释是 javax.persistence.OneToMany 注释,用来描述实体之间多对一关联关系的注释是 javax.persistence.OneToMany 注释,用来描述实体之间多对多关联关系的注释是 javax.persistence.ManyToMany 注释。这三个注释都支持 targetEntity、mappedBy、cascade 和 fetch 这四个属性,这些属性的具体含义和 OneToOne 注释注释的同名属性一一对应,请大家参考前面章节中的内容。

  javax.persistence.OneToMany、javax.persistence.OneToMany、javax.persistence.ManyToMany 这三个注释都可以和 javax.persistence.JoinColumns 注释一起使用,javax.persistence.JoinColumns 注释的作用是为一对多、多对一、多对多关联关系在数据库中的体现提供更多细节描述。javax.persistence.JoinColumns 注释中可以包含多个 javax.persistence.JoinColumn 注释的内容,javax.persistence.JoinColumn 注释的属性请参考本文前面部分的描述。

  总结

  对象和对象之间除了继承关系之外,还存在着关联关系,包括一对一、一对多、多对一和多对多的关系,本文中,作者以实体之间的一对一关联关系为例,结合企业应用中的实际例子,详细地描述了如何在 OpenJPA 框架下通过注释简单的描述实体和实体之间的关联关系,并且实现实体的级联操作。文章的最后简单的介绍了 OpenJPA 中实现实体之间一对多、多对一和多对多关联关系时需要用到的注释,这些注释的用法和描述一对一关联关系时大体一致,如何通过描述实现实体之间一对多、多对一和多对多关联关系请大家参考本文中的内容自行完成。

        相关内容下载:OpenJPAExamples3.zip

0
相关文章