首页 > 编程知识 正文

component注解的作用,component注解

时间:2023-05-04 13:19:11 阅读:111748 作者:2428

一对一关系

在面向对象的世界中,a类和b类要形成一对一的关系,必须满足以下条件:

1 .对象a-1引用了对象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注释支持以下五个属性: 这些属性可由开发人员用来定义实体与实体之间一对一关联的详细信息。

目标实体

targetEntity属性是类类型的属性。 以实体一对一的关系定义从属关系的实体类的类型。 如果未为此属性设置值,则在定义实体关系时通常不需要为targetEntity属性设置值,因为OpenJPA容器的默认targetEntity属性的值是与成员属性对应的类类型。

映射by

mappedBy属性是一个字符串类型的属性。 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级联刷新和cascade刷新这意味着选择上面所有四个项目。

fetch

fetch属性是FetchType类型的属性。 选项包括FetchType.EAGER和FetchType.LAZY。 前者表示在加载主类时将同时加载相关的从属类,后者表示在访问主类时将加载相关的从属类。 默认值为FetchType.EAGER。

可选的

可选属性

是 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 实体对应的表使用“称心的书本”字段和 BookExtend 实体对应表的主键进行对应,我们可以在 Book 类中为 bookExtend 属性提供 javax.persistence.JoinColumn 注释,设置它的 name 属性为“称心的书本”。

  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 = "称心的书本", referencedColumnName = "myID")
public BookExtend bookExtend;
}

 编写符合要求的持久化类

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

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

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

  3. Book 表中参与关联关系的字段名为“称心的书本”;

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。