编写符合要求的持久化类
根据模拟场景的需求,结合我们前面学习到的描述实体之间一对一关联关系的知识,我们可以采用如下设计:
Book 类和 BookExtend 之间存在一对一关联关系;
Book、BookExtend 对应的表的主键字段由 MySQL 自动生成;
Book 表中参与关联关系的字段名为“beID“;
BookExtend 表中参与关联关系的字段使用默认字段“ID”;
Book 类和 BookExtend 类之间存在全部级联关系;
不是每一个 Book 对象都需要有对应的 BookExtend 对象。
根据这样的设计,我们可以开始编写实体 Book 和 BookExtend 对应的持久化类代码,下面是作者编写的两个实体类的全部代码,大家可以参考代码中加入的大量注释学习如何使用注释来描述实体和实体之间的一对一关联关系。
Book 类
1. package org.vivianj.openjpa.beans;
2.
3. import javax.persistence.Basic;
4. import javax.persistence.CascadeType;
5. import javax.persistence.Column;
6. import javax.persistence.Entity;
7. import javax.persistence.GeneratedValue;
8. import javax.persistence.GenerationType;
9. import javax.persistence.Id;
10. import javax.persistence.Inheritance;
11. import javax.persistence.InheritanceType;
12. import javax.persistence.JoinColumn;
13. import javax.persistence.OneToOne;
14.
15. /**
16. * Book 用于表征系统中的书籍对象,它有三个属性 id - 书籍编号,
* 书籍编号将由 MySQL 数据库自动生成 name - 书名 bookExtend –
17. * 书的扩展信息,和 BookExtend 是一对一(OneToOne)关系
18. */
19.
20. @Entity(name = "Book")
21. public class Book {
22. /* Id 注释表示该字段是标识字段 */
23. @Id
24. /*
25. * GeneratedValue 注释定义了该标识字段的产生方式,我们的演示系统中
26. * id 由 MySQL 数据库字段自动生成,因此选择 GenerationType.IDENTITY
27. */
28. @GeneratedValue(strategy = GenerationType.IDENTITY)
29. /*
30. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
31. */
32. @Column(name = "ID")
33. public int id;
34.
35. /* Basic 注释表示该属性是基本属性 */
36. @Basic
37. /*
38. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
39. */
40. @Column(name = "NAME")
41. public String name = null;
42.
43. /*
44. * 使用 OneToOne 注释表示该属性和 Book 类形成一对一关系,OneToOne
45. * 注释的 option 属性设为 True 表示该对象可以不存在,cascade 属性
46. * 设置为 CascadeType.ALL,表示 Book 和 BookExtend 对象级联新建、 更新、删除、刷新
47. */
48. @OneToOne(optional = true, cascade = CascadeType.ALL)
49. /* 使用 JoinColumn 注释设置两个对象对应数据库表之间的关联字段 */
50. @JoinColumn(name = "extendID")
51. public BookExtend bookExtend;
52. }
2.
3. import javax.persistence.Basic;
4. import javax.persistence.CascadeType;
5. import javax.persistence.Column;
6. import javax.persistence.Entity;
7. import javax.persistence.GeneratedValue;
8. import javax.persistence.GenerationType;
9. import javax.persistence.Id;
10. import javax.persistence.Inheritance;
11. import javax.persistence.InheritanceType;
12. import javax.persistence.JoinColumn;
13. import javax.persistence.OneToOne;
14.
15. /**
16. * Book 用于表征系统中的书籍对象,它有三个属性 id - 书籍编号,
* 书籍编号将由 MySQL 数据库自动生成 name - 书名 bookExtend –
17. * 书的扩展信息,和 BookExtend 是一对一(OneToOne)关系
18. */
19.
20. @Entity(name = "Book")
21. public class Book {
22. /* Id 注释表示该字段是标识字段 */
23. @Id
24. /*
25. * GeneratedValue 注释定义了该标识字段的产生方式,我们的演示系统中
26. * id 由 MySQL 数据库字段自动生成,因此选择 GenerationType.IDENTITY
27. */
28. @GeneratedValue(strategy = GenerationType.IDENTITY)
29. /*
30. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
31. */
32. @Column(name = "ID")
33. public int id;
34.
35. /* Basic 注释表示该属性是基本属性 */
36. @Basic
37. /*
38. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
39. */
40. @Column(name = "NAME")
41. public String name = null;
42.
43. /*
44. * 使用 OneToOne 注释表示该属性和 Book 类形成一对一关系,OneToOne
45. * 注释的 option 属性设为 True 表示该对象可以不存在,cascade 属性
46. * 设置为 CascadeType.ALL,表示 Book 和 BookExtend 对象级联新建、 更新、删除、刷新
47. */
48. @OneToOne(optional = true, cascade = CascadeType.ALL)
49. /* 使用 JoinColumn 注释设置两个对象对应数据库表之间的关联字段 */
50. @JoinColumn(name = "extendID")
51. public BookExtend bookExtend;
52. }
BookExtend 类
1. package org.vivianj.openjpa.beans;
2.
3. import javax.persistence.Basic;
4. import javax.persistence.Column;
5. import javax.persistence.Entity;
6. import javax.persistence.GeneratedValue;
7. import javax.persistence.GenerationType;
8. import javax.persistence.Id;
9. import javax.persistence.Inheritance;
10. import javax.persistence.InheritanceType;
11.
12. /**
13. * BookExtend 用于表征系统中书的扩展信息,它有两个属性:
* id - 扩展信息编号,扩展信息编号将由 MySQL 数据库自动生成
14. * name -书的前言信息
15. */
16. @Entity
17. public class BookExtend {
18. /* Id 注释表示该字段是标识字段 */
19. @Id
20. /*
21. * GeneratedValue 注释定义了该标识字段的产生方式,我们的演示系统中
22. * id 由 MySQL 数据库字段自动生成,因此选择 GenerationType.IDENTITY
23. */
24. @GeneratedValue(strategy = GenerationType.IDENTITY)
25. /*
26. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
27. */
28. @Column(name = "ID")
29. public int id;
30.
31. /* Basic 注释表示该属性是基本属性 */
32. @Basic
33. /*
34. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
35. */
36. @Column(name = "NAME")
37. public String name = null;
38. }
2.
3. import javax.persistence.Basic;
4. import javax.persistence.Column;
5. import javax.persistence.Entity;
6. import javax.persistence.GeneratedValue;
7. import javax.persistence.GenerationType;
8. import javax.persistence.Id;
9. import javax.persistence.Inheritance;
10. import javax.persistence.InheritanceType;
11.
12. /**
13. * BookExtend 用于表征系统中书的扩展信息,它有两个属性:
* id - 扩展信息编号,扩展信息编号将由 MySQL 数据库自动生成
14. * name -书的前言信息
15. */
16. @Entity
17. public class BookExtend {
18. /* Id 注释表示该字段是标识字段 */
19. @Id
20. /*
21. * GeneratedValue 注释定义了该标识字段的产生方式,我们的演示系统中
22. * id 由 MySQL 数据库字段自动生成,因此选择 GenerationType.IDENTITY
23. */
24. @GeneratedValue(strategy = GenerationType.IDENTITY)
25. /*
26. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
27. */
28. @Column(name = "ID")
29. public int id;
30.
31. /* Basic 注释表示该属性是基本属性 */
32. @Basic
33. /*
34. * Column 注释的 name 属性定义了该类属性对应的数据字段的名称,
* 为了最大限度保持系统和数据库之前的独立性,建议使用大写字符
35. */
36. @Column(name = "NAME")
37. public String name = null;
38. }
调用代码
上面的代码中,我们已经准备好了符合要求的持久化类,下面我们看看 OpenJPA 中如何调用这两个类完成 Book 类和 BookExtend 类的创建、修改、删除工作。
由于篇幅的关系,这些没有讲述如何编译、加强这些类并且准备相应的配置文件来完成整个项目开发环境的建立,这部分的内容请参考另外一篇文章《OpenJPA:符合 EJB3 规范的持久层框架》。