`

Java Persistent API 注解

阅读更多

一对一关系

  在面向对象的世界里,类 A 和类 B 之间形成一对一关系必须满足如下条件:

  1. 对象 A1 引用了对象 B1;

  2. 类 A 的其它对象 An 不能引用同样的对象 B1.

  在关系数据库中,我们通常使用唯一外键的方式来实现一对一关系,下面这个图说明了这种的情况。

  图 1. 关系数据库中的一对一关系

  下面开始介绍 OpenJPA 中实现实体之间一对一关联关系的相关知识,为了说明的需要,我们首先定义一个简单的应用场景。

  模拟场景

  假定开发者要完成一个图书馆管理系统,我们需要记录书的基本信息如编号、书名、出版日期等基本信息,还需要记录书的前言,序等信息。

  为了说明实体之间的一对一关系,我们将书设计成一个类(Book),包括书的编号和名称两个属性,同时将书的前言设计成另外一个类(BookExtend),它包括书的编号和前言两个属性。由于一本书有前言而且也不可能有其它书的前言部分会和它一样,所以类 Book 和 BookExtend 之间很自然的形成了一对一的关系。这两个类的属性以及类之间的关系如下图所示。

  图 2. 类之间的一对一关系

  [注]:为了说明的简单,本例子设计时每个对象只选择了必要的属性。

  描述一对一关系

  在 OpenJPA 中,开发者用来描述实体之间一对一关系时可选择的注释包括 javax.persistence.OneToOne 和 javax.persistence.JoinColumn.其中 javax.persistence.OneToOne 注释是必须使用的,它被用来声明类和类之间存在着一对一关系,javax.persistence.JoinColumn 注释是可选的,开发者使用 JoinColumn 注释来声明两个类在数据库中对应的表之间关联时的细节,包括主表中关联字段的名称、从表中使用什么字段来进行关联等。

  javax.persistence.OneToOne

  javax.persistence.OneToOne 注释支持如下 5 个属性,它们可以被开发者用来定义实体和实体之间一对一关联关系的细节内容。

  target Entity

  targetEntity 属性是 Class 类型的属性。定义实体一对一关系中处于从属地位的实体类的类型。如果没有为该属性设置值,OpenJPA 容器默认 targetEntity 属性的值是该成员属性对应的类类型,所以实体关系定义时通常不需要为 targetEntity 属性设置值。

  mappedBy

  mappedBy 属性是 String 类型的属性。mappedBy 属性的值是当前实体在关联实体中的属性名称,使用 mappedBy 可以定义实体类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。

  以演示场景中 Book 和 BookExtend 实体为例,假设我们只定义 Book 类有 BookExtend 类型的属性,而 BookExtend 并没有 Book 类型的属性,那么说明 Book 和 BookExtend 实体之间是单向关系;如果 BookExtend 中也定义了 Book 属性,那么 Book 和 BookExtend 实体之间就构成了双向关系。

 cascade

  cascade 属性的类型是 CascadeType[] 类型。cascade 属性定义实体和实体之间的级联关系。使用 cascade 属性定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。

  以演示场景中 Book 和 BookExtend 实体为例:如果设置 Book 和 BookExtend 存在级联关系,那么删除 Book 时将同时删除它所对应的 BookExtend 对象。而如果 BookExtend 还和其它的对象之间有级联关系,那么这样的操作会一直递归执行下去。

  cascade 的值只能从 CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个更方便的选择是使用 CascadeType.ALL,表示选择上面全部四项。

  fetch

  fetch 属性是 FetchType 类型的属性。可选择项包括:FetchType.EAGER 和 FetchType.LAZY.前者表示关联关系的从类在主类加载的时候同时加载,后者表示关联关系的从类在自己被访问时才加载。默认值是 FetchType.EAGER.

  optional

  optional 属性是 boolean 类型的属性。optional 属性用于定义关联关系的从类对象是否必须存在。如果设置为 false,那么该属性就不能设置为 null.默认值是 true.

  javax.persistence.OneToOne 用法举例

public class Book {
// 其它实体映射内容…
/*
* 使用 OneToOne 注释表示该属性和 Book 类形成一对一关系,OneToOne
* 注释的 option 属性设为 True 表示该对象可以不存在,cascade 属性
* 设置为 CascadeType.ALL,表示 Book 和 BookExtend 对象级联新建、 更新、删除、刷新
*/
@OneToOne(optional=true,cascade=CascadeType.ALL)
public BookExtend bookExtend;
}

  javax.persistence.JoinColumn

  javax.persistence.JoinColumn 注释可以和 javax.persistence.OneToOne 注释一起使用,用于定义关联关系中的主类在数据库中对应的表通过什么字段和关联关系中的从类的主键进行关联,这个注释是可选的,如果不提供该注释,OpenJPA 会默认使用“对象名_ID”和关联表的主键字段进行关联。

  以演示场景中 Book 和 BookExtend 实体为例:如果 Book 的 bookExtend 属性没有使用 javax.persistence.JoinColumn 注释进行声明,我们使用 OpenJPA 提供的 Mapping Tool 工具生成表格的时候,Book 类对应的表 Book 中将自动加入列 bookExtend_ID,它的类型将和 BookExtend 对应表的主键字段id类型保持一致。

  JoinColumn 注释支持两个重要属性:name 和 referencedColumnName 属性。

  name

  name 属性的类型是 String 类型。name 属性用于指定关联关系中的主类对应的表中和关联关系中的从类的主键进行关联的字段的名称。以演示场景中 Book 和 BookExtend 实体的关系为例:如果 Book 实体对应的表使用“beID”字段和 BookExtend 实体对应表的主键进行对应,我们可以在 Book 类中为 bookExtend 属性提供 javax.persistence.JoinColumn 注释,设置它的 name 属性为“beID”。

  referencedColumnName

  referencedColumnName 属性的类型是 String 类型。referencedColumnName 属性指定关联关系中的从类与关联关系中的主类对应的表之间形成关联关系的字段名称,通常用于关联关系中的从类的关联字段不是自己的主键的情况。以演示场景中 Book 和 BookExtend 实体的关系为例:BookExtend 表中默认使用 Id 字段和 Book 类的某个字段进行关联,但如果实际情况下 BookExtends 表需要使用“myID”字段和 Book 表进行关联,我们就可以设置 javax.persistence.JoinColumn 注释的属性值为“myID”。

  javax.persistence.JoinColumn 用法举例

public class Book {
// 其它内容…

/*
* 使用 OneToOne 注释表示该属性和 Book 类形成一对一关系,OneToOne
* 注释的 option 属性设为 True 表示该对象可以不存在,cascade 属性
* 设置为 CascadeType.ALL,表示 Book 和 BookExtend 对象级联新建、 更新、删除、刷新
*/
@OneToOne(optional = true, cascade = CascadeType.ALL)
/*
* 使用 JoinColumn 注释设置两个对象对应数据库表之间的关联字段
* name 属性指定关联关系中主类对应表中参与关联关系的字段名称,
* referencedColumnNam 属性指定关联关系中从类对应表中参与关
* 联关系的字段名称,
*/
@JoinColumn(name = "beID", referencedColumnName = "myID")
public BookExtend bookExtend;
}

 编写符合要求的持久化类

  根据模拟场景的需求,结合我们前面学习到的描述实体之间一对一关联关系的知识,我们可以采用如下设计:

  1. Book 类和 BookExtend 之间存在一对一关联关系;

  2. Book、BookExtend 对应的表的主键字段由 MySQL 自动生成;

  3. Book 表中参与关联关系的字段名为“beID”;

  4. BookExtend 表中参与关联关系的字段使用默认字段“ID”;

  5. Book 类和 BookExtend 类之间存在全部级联关系;

  6. 不是每一个 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. }

  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. }

 
分享到:
评论

相关推荐

    JPA开发文档API

    Java Persistence API(JPA)是Java平台上的一个标准,它为Java开发者提供了处理关系型数据库的面向对象方式,旨在简化数据库操作,同时也保留了JDBC的强大力量。JPA的目标是解决在JDBC中使用关系模型来表示和管理...

    Apress.Pro.EJB.3.Java.Persistence.API.pdf

    《Apress.Pro.EJB.3.Java.Persistence.API》这本书深入探讨了Java企业版(EJB)3中的持久化API,即Java Persistence API(JPA)。EJB 3是Java平台企业级应用开发的重要组成部分,它提供了对数据库操作的标准化框架,...

    eclipse中搭建java企业级项目

    JPA(Java Persistent API) JPA 是 Java 持久层 API 的简称,是 Java 企业级应用程序中的一种持久层规范。它提供了一种可以跨越多种数据库管理系统的标准化接口,允许开发人员使用 Java 语言编写的应用程序来访问...

    jdo2-api-2.0

    这个API使得开发人员能够在Java应用程序中与数据库交互,而无需直接编写SQL语句。 JDO2-API-2.0主要包含以下几个关键概念和功能: 1. **Datastore Persistence Model**:JDO定义了一个数据存储持久化模型,允许...

    jdo API 2.2

    5. **Annotations**: JDO 2.2支持使用Java 5+的注解来标记持久化类和属性,简化了对象模型的定义。例如,`@PersistenceCapable`表示类是可持久化的,`@Persistent`表示属性需要被持久化。 6. **Transactions**: JDO...

    Berkeley DB Java 版直接持久层基础1

    在Berkeley DB Java 版本中,使用Java Annotation来实现数据的持久化,例如使用@Entity注解来标记实体类,使用@PrimaryKey注解来标记主键字段等。 Berkeley DB Java 版本也支持Java泛型类型。Java泛型类型是一种...

    《Hibernate 3 API参考手册》-电子文档下载(PDF)

    在描述中提到的“配合Hibernate 3中文参考使用”,意味着此手册可能包含有中文翻译或注释,这对于中文使用者来说是极大的便利,能够帮助他们更好地理解和应用Hibernate 3的API。 关于Hibernate 3 API,它是...

    JEPLA - Java Easy Persistent Layer-开源

    **JEPLA - Java Easy Persistent Layer** JEPLA是一个开源的Java框架,专注于简化对象关系映射(ORM)过程,使开发人员能够更方便地处理持久化对象。它旨在为Java应用程序提供一个易于使用的持久层,同时保持面向...

    Java持久性和休眠指南(S. Hennebrueder)Guide to Java Persistence and Hibernate (S. Hennebrueder)

    Java Persistence API(JPA)是一个Java EE的持久性标准,Hibernate则是这个标准的一个实现。两者之间有一些差异,但Hibernate提供了对JPA的广泛支持。 ### 6. Hibernate API与EntityManager API Hibernate API是...

    hibernate3 api

    同时,它也支持Java Persistence API (JPA)规范,使得开发者可以选择更符合自己需求的编程模式。 综上所述,Hibernate3 API手册涵盖了所有这些关键概念和用法,是开发人员深入理解和有效利用Hibernate进行数据库...

    jpa的详细java资料

    EJB3.0 不仅仅局限于 EJB 容器内部,其持久化 API 还扩展到了 Java SE 和 Java EE 环境之外,成为了一种通用的 Java 持久化 API。这意味着开发者可以在 Java SE 应用、Web 应用以及 EJB 应用中使用相同的持久化 API...

    2022年Java数据对象(JDO)的前世今生Java教程.docx

    1. **持久化类(Persistent Classes)**:这些是Java类,它们的实例可以被存储到数据库中。JDO允许开发者使用注解或XML配置文件来指定哪些类是持久化的,以及它们如何映射到数据库表。 2. **数据管理(Data ...

    Enterprise Java beans 3.0 , Fifth Edition

    10. 持久化对象映射(Mapping Persistent Objects):这部分详细讲解了如何使用注解(Annotations)和XML配置文件来映射Java对象到数据库表。 11. 实体关系(Entity Relationships):介绍了实体之间的关系,例如一...

    javahibernate

    在Java Hibernate中,核心概念包括实体(Entities)、持久化类(Persistent Classes)、配置文件(Hibernate Configuration File)、会话工厂(SessionFactory)和会话(Session)。实体是应用程序中的业务对象,...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    Hibernate是Java领域内最受欢迎的对象关系映射(ORM)框架之一,它简化了Java应用程序与关系型数据库之间的交互,使得开发人员能够用面向对象的方式处理数据库操作,而无需深入了解SQL语法或数据库API。通过将Java...

    hibernate教程+3.0API

    《Hibernate教程+3.0 API》是一份深度探讨Java持久化框架Hibernate的资源包,包含两个重要的文件:`Hibernate+3.13+api.chm` 和 `HIBERNATE.chm`。这两个CHM文件通常包含了详尽的API文档和可能的教程内容,旨在帮助...

    hibernate_4.1.6.Final-api

    《Hibernate 4.1.6.Final API:Java对象关系映射的艺术》 Hibernate,作为Java领域中的一个著名持久化框架,一直以来都是开发者们进行数据库操作的重要工具。它以其强大的对象关系映射(ORM)能力,极大地简化了...

    hibernate_annotations API中文

    其Annotations模块则是Hibernate的核心部分之一,它允许开发者使用Java注解来定义对象模型,从而避免了传统的XML配置文件。本文将深入探讨Hibernate Annotations API中文版中的关键概念和用法。 一、实体(Entity)...

    Hibernate_API

    6. **Entity和Persistent Class**:在Hibernate中,实体类代表数据库表,通过@Entity注解标记,其属性与表的列相对应。Hibernate自动处理对象与数据库表之间的映射。 7. **Association Mapping**:Hibernate支持...

    hibernateAPI

    - **持久化类(Persistent Class)**: 带有@Entity注解的Java类,表示一个数据库表。 - **映射文件(Mapping File)**: XML或注解形式,定义实体类和数据库表之间的映射关系。 - **Criteria查询**: 通过Criteria API...

Global site tag (gtag.js) - Google Analytics