- 浏览: 20276 次
- 性别:
- 来自: 青岛
文章分类
最新评论
假设应用场景如下:Node与PageServer是一对一的关系,其中,Node类对应node表如下:
PageServer类对应page_server表如下:
两个类分别如下:
说明
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类型的属性。定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
说明
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 (…..)查询出所有关联的数据。
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 (…..)查询出所有关联的数据。
发表评论
文章已被作者锁定,不允许评论。
-
Sping定时器Quarz
2013-04-08 18:04 699Spring定时器 <?xml version=& ... -
Java Jaxb
2013-04-08 17:56 607JAXB java对象与xml转化 import j ... -
Xifre超时机制
2013-03-27 16:55 687URL _url = new URL("http ... -
Java二维码
2013-01-13 14:37 919二维码的特点: 1. 高密度编码,信息容量大 可容纳 ... -
ActiveMQ5.5安全配置
2013-01-13 13:51 495JMS服务安全配置(生产者和消息者连接时认证) 简单授权方 ... -
jquery的each()详细介绍
2013-01-11 21:34 499jquery的each()详细介绍 each()方法能使DO ... -
js注意事项
2013-01-08 14:16 5521.传统的HTML文档顺序是: ... -
java中instanceof用法
2013-01-06 18:18 759java 中的instanceof 运算符是用来在运行时指出对 ... -
常见DB的 驱动类名 和 URL
2013-01-06 17:22 761MySQL: com.mysql.jdbc.Driver ... -
spring security应用
2013-01-03 14:49 0一、配置文件 <?xml version="1 ... -
Ehcache 整合Spring 使用页面、对象缓存
2013-01-03 12:03 0Ehcache在很多项目中都出现过,用法也比较简单。一般的加些 ... -
StringUtils的isBlank与isEmply
2013-01-03 11:59 10911. public static boolean isEmpt ... -
SQL中如何为表添加外键约束
2013-01-02 18:11 1069定义格式 [CONSTRAINT <约束名>][ ... -
java中Long类型数据必须转化为int才能正确比较
2013-01-02 18:08 2135java中如果有Long类型数据需要比较判断时, 必须转化 ... -
Hibernate Annotation注解和关系映射
2013-01-01 23:49 7351. Hibernate Annotation关系 ... -
struts2 中的 addActionError 、addFieldError、addActionMessage的方法
2013-01-01 18:07 870一、 addActionError("错误内容&qu ... -
java使用xfire创建和调用webservices
2013-01-01 10:55 6401.创建工程 File->New->Web S ... -
Spring 2.5.6新特性之packagesToScan
2012-12-28 17:11 763如果你使用早前版本的Spring,又恰好采用了Annotati ... -
Hibernate+spring缓存机制配置
2012-12-28 16:59 681在applicationContext.xml文件中添加以下代 ... -
Spring的PropertyPlaceholderConfigurer
2012-12-28 16:50 6231. PropertyPlaceholderConfigure ...
相关推荐
JPA注解和Hibernate建表 一、JPA概述 Java Persistence API(JPA)是Sun官方提出的Java持久化规范,它只是一个规范不是一个产品。JPA的主要目标是提供一种简洁、易用的方式来访问、操作和管理Java应用程序中的数据...
@OneToOne、@OneToMany、@ManyToOne:这些注解分别对应于一对一、一对多和多对一的数据库表关系。 关于MAVEN打包的问题,当pom.xml文件不存在或无法激活时,通常需要在pom.xml中添加maven-compiler-plugin插件,并...
**JPA注解@Access详解** Java Persistence API (JPA) 是Java中用于对象关系映射(ORM)的标准框架,它允许开发人员将Java类与数据库表进行映射,从而简化数据操作。在JPA中,`@Access`注解是用于指定实体属性访问...
- `@OneToOne`:表示一对一关系,每个实例只对应另一个实例。 - `@ManyToMany`:表示多对多关系,一方可以有多个另一方实例,反之亦然。 - `@JoinColumn` 和 `@JoinTable`:定义关联的列或表。 4. **扩展和特殊...
- **`@OneToOne`**:表示一对一的关系。 - **`@ManyToOne`**:表示一对多的关系。 - **`@OneToMany`**:表示多对一的关系。 - **`@ManyToMany`**:表示多对多的关系。 - **`@MapKey`**:用于定义 Map 的 key 的映射...
- **用途**:`@ManyToOne` 注解用于表示多对一的关联关系,通常对应于表中的外键。 - **参数**: - `fetch`:可选参数,表示加载策略,默认为 `EAGER`。 - `cascade`:可选参数,表示级联操作的类型,常见的有: ...
5. **@JoinColumn**: 当实体类中包含一对多或一对一的关系时,这个注解用于指定外键列。它可以定义在关联的属性上,指定外键所在的列名,以及它如何与关联实体的主键关联。 示例: ```java public class Order {...
8. **@OneToOne**: 表示一对一关系,一个实体类的一个实例只对应另一个实体的一个实例。这通常用于关联具有唯一性的数据,如用户与其个人信息。 9. **@ManyToMany**: 表示多对多关系,一个实体类的实例可以对应另一...
假设我们有一个`User`实体类,包含`id`、`name`和`birthday`字段,并且与`Department`实体类有一对多的关系。 ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = ...
当两个实体之间存在一对一或多对一的关系时,可以使用 `@JoinColumn` 来定义这种关系。 **示例代码:** ```java @Entity public class Employee { @JoinColumn(name = "DEPT_ID") private Department department;...
8. `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于定义实体间的关联关系,如一对一、一对多、多对一和多对多关系。 9. `@JoinColumn` 和 `@JoinTable`:用于在关联关系中指定外键或中间表...
- **@OneToOne** / **@ManyToOne** / **@OneToMany** / **@ManyToMany**:分别用于一对一、一对多、多对一和多对多的关系映射。 - **@MapKey**:用于多对多关系中,指定集合中的键。 - **@OrderBy**:指定集合中...
- `@JoinColumn`, `@JoinColumns`: 用于建立实体间的一对一或一对多关系。 - `@PrimaryKeyJoinColumn`, `@PrimaryKeyJoinColumns`: 定义外键作为主键的引用。 - `@JoinTable`: 处理多对多关系,定义中间表。 3. ...
3. **实体关系(Entity Relationships)**: 如一对一、一对多、多对一和多对多,使用`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`注解表示。 4. **查询(Querying)**: 使用JPQL(Java Persistence ...
- **定义**:`@ManyToOne` 注解表示一个多对一的关联关系,通常与外键相关联。 - **属性**: - `fetch`:表示抓取策略,默认为 `FetchType.EAGER`。 - `optional`:是否允许该字段为 `null`,根据数据库表的外键...
关联关系是数据库设计的重要组成部分,JPA提供了多种关联类型:一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过`@JoinColumn`或`@JoinTable`注解进行...
2. ID(Identifier):每个实体都有一个唯一标识符,由`@Id`注解标注。 3. Repository(仓库):Spring Data JPA通过Repository接口提供CRUD(创建、读取、更新、删除)操作,无需编写具体的DAO(数据访问对象)代码...
10. **关系映射(Relationship Mapping)**:JPA提供了多种方式来处理对象之间的关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。 在实际项目中,JPA的使用通常涉及...
JPA支持各种关系映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过这些注解,开发者可以清晰地定义实体间的关系,使得数据库操作更加直观和方便。 8. 实体...
- 实体类需要使用 `@Entity` 注解标注,并定义主键、字段等属性。 2. **创建 Repository 接口**: - 继承 `JpaRepository, ID>` 接口,其中 `T` 是实体类型,`ID` 是主键类型。例如: ```java public ...