`

如何使用JPA注解标注一对一的关系

阅读更多
假设应用场景如下:Node与PageServer是一对一的关系,其中,Node类对应node表如下:

CREATE TABLE `node` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


PageServer类对应page_server表如下:

CREATE TABLE `pageserver` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `node_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_reference_67` FOREIGN KEY (`node_id`) REFERENCES `node` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;



两个类分别如下:


public class Node {
 private PageServer pageServer;//PageServer实体

 @OneToOne(mappedBy = "node", fetch = FetchType.LAZY)
 public PageServer getPageServer() {
 return pageServer;
 }

 public void setPageServer(PageServer pageServer) {
 this.pageServer = pageServer;
 }

}


说明

1、该类经过简化,没有全部列出代码,在此我们只关注OneToOne注解及其属性设置。

2、@OneToOne

@OneToOne注解指明 Node 与 PageServer 为一对一关系,@OneToOne注解有五个属性:mappedBy、fetch、targetEntity、cascade 和 optional 。

3、mappedBy=”node”

如果两个实体Bean是双向一对一关联关系,那么使用了mappedBy的一端我们称为关系目标方(方便起见,称为被控方他the Owned),另一端称之为关系拥有方(方便起见,称为控制方 the Owner)。相应的对象称之为被控对象和主控对象。

只有在双向关联时才会使用mappedBy属性,只有OneToOne、OneToMany、ManyToMany上才有mappedBy属性,ManyToOne不存在该属性。

mappedBy标签一定是定义在the owned side(被拥有方的),并指向the owning side(拥有方)的。在本例中,Node类为关系目标方,即被控对象,the Owned 端;PageServer类为关系拥有方,即主控对象, the Owner 。

mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方中有被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。

4、fetch = FetchType.LAZY

FetchType类型的属性。可选择项包括:FetchType.EAGER 和FetchType.LAZY。

fetch属性默认值是FetchType.EAGER。

FetchType.EAGER表示被控对象(本例是Node类)在主控对象加载的时候同时加载,FetchType.LAZY表示被控对象在被访问时才加载。默认值是FetchType.LAZY。

5、targetEntity

Class类型的属性。定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。


public class PageServer {
 private Node node;//所属节点

 @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
 @JoinColumn(name = "node_id")
 @Fetch(FetchMode.JOIN)
 public Node getNode() {
 return this.node;
 }

 public void setNode(Node node) {
 this.node = node;
 }
}


说明

1、cascade属性

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

默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括:

CascadeType.ALL
针对拥有实体执行的任何持续性操作均层叠到关联的目标。

CascadeType.MERGE
如果合并了拥有实体,则将 merge 层叠到关联的目标。

CascadeType.PERSIST
如果持久保存拥有实体,则将 persist 层叠到关联的目标。

CascadeType.REFRESH
如果刷新了拥有实体,则 refresh 为关联的层叠目标。

CascadeType.REMOVE
如果删除了拥有实体,则还删除关联的目标。

2、JoinColumn属性

@OneToOne注释只能确定实体与实体的关系是一对一的关系,不能指定数据库表中的保存的关联字段。所以此时要结合@JoinColumn标记来指定保存实体关系的配置。

3、Fetch属性

可设置以下三个值:
@Fetch(FetchMode.JOIN) 会使用left join查询,只产生一条sql语句;
@Fetch(FetchMode.SELECT)   会产生N+1条sql语句;
@Fetch(FetchMode.SUBSELECT)  产生两条sql语句 第二条语句使用id in (…..)查询出所有关联的数据。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JPA注解@Access实例

    **JPA注解@Access详解** Java Persistence API (JPA) 是Java中用于对象关系映射(ORM)的标准框架,它允许开发人员将Java类与数据库表进行映射,从而简化数据操作。在JPA中,`@Access`注解是用于指定实体属性访问...

    JPA注解 和hibernate 建表

    JPA注解和Hibernate建表 一、JPA概述 Java Persistence API(JPA)是Sun官方提出的Java持久化规范,它只是一个规范不是一个产品。JPA的主要目标是提供一种简洁、易用的方式来访问、操作和管理Java应用程序中的数据...

    JPA注解的解释和说明.pdf

    @OneToOne、@OneToMany、@ManyToOne:这些注解分别对应于一对一、一对多和多对一的数据库表关系。 关于MAVEN打包的问题,当pom.xml文件不存在或无法激活时,通常需要在pom.xml中添加maven-compiler-plugin插件,并...

    JPA 标注 JPA标签手册

    - `@OneToOne`:表示一对一关系,每个实例只对应另一个实例。 - `@ManyToMany`:表示多对多关系,一方可以有多个另一方实例,反之亦然。 - `@JoinColumn` 和 `@JoinTable`:定义关联的列或表。 4. **扩展和特殊...

    JPA批注参考(主要介绍JPA中的相关注解)

    - **`@OneToOne`**:表示一对一的关系。 - **`@ManyToOne`**:表示一对多的关系。 - **`@OneToMany`**:表示多对一的关系。 - **`@ManyToMany`**:表示多对多的关系。 - **`@MapKey`**:用于定义 Map 的 key 的映射...

    JPA注解总结

    - **用途**:`@ManyToOne` 注解用于表示多对一的关联关系,通常对应于表中的外键。 - **参数**: - `fetch`:可选参数,表示加载策略,默认为 `EAGER`。 - `cascade`:可选参数,表示级联操作的类型,常见的有: ...

    jpa常用标注

    5. **@JoinColumn**: 当实体类中包含一对多或一对一的关系时,这个注解用于指定外键列。它可以定义在关联的属性上,指定外键所在的列名,以及它如何与关联实体的主键关联。 示例: ```java public class Order {...

    jpa标注中文文档html格式

    8. **@OneToOne**: 表示一对一关系,一个实体类的一个实例只对应另一个实体的一个实例。这通常用于关联具有唯一性的数据,如用户与其个人信息。 9. **@ManyToMany**: 表示多对多关系,一个实体类的实例可以对应另一...

    JPA注解详细解释、EJB3、 Hibernate开发

    假设我们有一个`User`实体类,包含`id`、`name`和`birthday`字段,并且与`Department`实体类有一对多的关系。 ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = ...

    JPA标注推荐圈子: Database圈子

    当两个实体之间存在一对一或多对一的关系时,可以使用 `@JoinColumn` 来定义这种关系。 **示例代码:** ```java @Entity public class Employee { @JoinColumn(name = "DEPT_ID") private Department department;...

    JPA规范注解的javax.persistence包

    8. `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于定义实体间的关联关系,如一对一、一对多、多对一和多对多关系。 9. `@JoinColumn` 和 `@JoinTable`:用于在关联关系中指定外键或中间表...

    jpa 标注

    - **@OneToOne** / **@ManyToOne** / **@OneToMany** / **@ManyToMany**:分别用于一对一、一对多、多对一和多对多的关系映射。 - **@MapKey**:用于多对多关系中,指定集合中的键。 - **@OrderBy**:指定集合中...

    JPA标注说明文档(带文档结构整理)

    - `@JoinColumn`, `@JoinColumns`: 用于建立实体间的一对一或一对多关系。 - `@PrimaryKeyJoinColumn`, `@PrimaryKeyJoinColumns`: 定义外键作为主键的引用。 - `@JoinTable`: 处理多对多关系,定义中间表。 3. ...

    jpa框架资源基于hibernate

    3. **实体关系(Entity Relationships)**: 如一对一、一对多、多对一和多对多,使用`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`注解表示。 4. **查询(Querying)**: 使用JPQL(Java Persistence ...

    JPA -amp Hibernate 注解

    - **定义**:`@ManyToOne` 注解表示一个多对一的关联关系,通常与外键相关联。 - **属性**: - `fetch`:表示抓取策略,默认为 `FetchType.EAGER`。 - `optional`:是否允许该字段为 `null`,根据数据库表的外键...

    Spring Data JPA从入门到精通

    关联关系是数据库设计的重要组成部分,JPA提供了多种关联类型:一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过`@JoinColumn`或`@JoinTable`注解进行...

    springboot-jpa加上jdbctemple

    2. ID(Identifier):每个实体都有一个唯一标识符,由`@Id`注解标注。 3. Repository(仓库):Spring Data JPA通过Repository接口提供CRUD(创建、读取、更新、删除)操作,无需编写具体的DAO(数据访问对象)代码...

    JPA框架jar包

    10. **关系映射(Relationship Mapping)**:JPA提供了多种方式来处理对象之间的关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。 在实际项目中,JPA的使用通常涉及...

    spring boot 整合JPA及使用方法

    JPA支持各种关系映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过这些注解,开发者可以清晰地定义实体间的关系,使得数据库操作更加直观和方便。 8. 实体...

    Spring-data-jpa常用教程.pdf

    - 实体类需要使用 `@Entity` 注解标注,并定义主键、字段等属性。 2. **创建 Repository 接口**: - 继承 `JpaRepository, ID>` 接口,其中 `T` 是实体类型,`ID` 是主键类型。例如: ```java public ...

Global site tag (gtag.js) - Google Analytics