JPA_映射关联关系

一:单项多对一的关联关系
例如:订单和客户
1.新创建订单类
package com.atguigu.jpa.helloworld; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; @Table(name = "JPA_ORDERS")
@Entity
public class Order { private Integer id ;
private String orderName;
private Customer customer; @GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
} @Column(name = "ORDER_NAME")
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
//映射单向多对一n-1的关联关系
//使用@ManyToOne来映射多对一的关联关系
//使用@JoinColumn来映射外键
@JoinColumn(name = "CUSTOMER_ID")
@ManyToOne
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
} }
配置文件persistence.xml添加:
<!-- 添加持久化类 -->
<class>com.atguigu.jpa.helloworld.Order</class>
进行测试:
1)保存测试:
/**
* 保存多对一时,建议先保存1的一段,后保存n的一端,
* 这样不会多出额外的update语句
*/
@Test
public void testManyToOnePersist(){
Customer customer = new Customer();
customer.setAge(188);
customer.setBirth(new Date());
customer.setCreatedDate(new Date());
customer.setEmail("fffff.emal");
customer.setLastName("ffffff"); Order order1 = new Order();
order1.setOrderName("O-FF-1"); Order order2 = new Order();
order2.setOrderName("O-FF-2"); //设置关联关系
order1.setCustomer(customer);
order2.setCustomer(customer); //执行保存操作
entityManager.persist(customer);
entityManager.persist(order1);
entityManager.persist(order2);
}
2)获取测试:
/**
* 默认情况下,使用做外连接的方式获取n的一端的对象和其关联的1的一端的对象
* 可使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略
*/
@Test
public void testManyToOneFind(){
Order order = entityManager.find(Order.class, 1);
System.out.println(order.getOrderName()); System.out.println(order.getCustomer().getLastName());
}
输出:

使用懒加载的方式:
//映射单向多对一n-1的关联关系
//使用@ManyToOne来映射多对一的关联关系
//使用@JoinColumn来映射外键
//可使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略
@JoinColumn(name = "CUSTOMER_ID")
@ManyToOne(fetch = FetchType.LAZY)
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
输出:

3)删除测试
/**
* 不能直接删除1 的一端,因为有外键约束
*/
@Test
public void testManyToOneRemove(){
/*Order order = entityManager.find(Order.class, 1);
entityManager.remove(order);*/ Customer customer = entityManager.find(Customer.class, 1);
entityManager.remove(customer); }
4)更新测试
@Test
public void testManyToOneUpdate(){
Order order = entityManager.find(Order.class, 1);
order.getCustomer().setLastName("FFFF");
}
JPA_映射关联关系的更多相关文章
- JPA学习(四、JPA_映射关联关系)
框架学习之JPA(四) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...
- 9、JPA_映射双向一对一的关联关系
双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系.则Manager实体类中有Department实体对象的引用,反之亦然. 其实体属性定义如下: Lis ...
- JPA(六):映射关联关系------映射单向一对多的关联关系
映射单向一对多的关联关系 新建项目项目请参考<JPA(二):HellWord工程>,基于上一章讲解的<JPA(五):映射关联关系------映射单向多对一的关联关系>中的例子进 ...
- 10、JPA_映射双向多对多的关联关系
双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对 ...
- 6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)
单向多对一的关联关系 具体体现:n的一方有1的引用,1的一方没有n的集合属性 举个例子:订单Order对顾客Customer是一个单向多对一的关联关系.Order是n的一方,有对Customer的引用 ...
- JPA_映射双向多对多的关联关系(转)
双向多对多的关联关系 转自(http://www.cnblogs.com/lj95801/p/5011537.html) 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也 ...
- Hibernate —— 映射关联关系
一.映射多对一关联关系. 1.单向的多对一 (1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户.从 Order 到 Customer 是多对一关联关 ...
- JPA(七):映射关联关系------映射双向多对一的关联关系
映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone; import java.util.Date; import java. ...
- JPA(五):映射关联关系------映射单向多对一的关联关系
映射单向多对一的关联关系 新建Customer.java: package com.dx.jpa.singlemanytoone; import java.util.Date; import java ...
随机推荐
- 【Docker Compose】简介与安装
1.简介 Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置 ...
- markdown设置编辑基本语法
看到其他人写的东西,版面设计,文字样式,区域划分都是那么好看,我一直不知道是怎么设计的,今天发现了,做以记录. #一.设置Markdown编辑模式 二.Markdown编辑语法 一.标题 在想要设置为 ...
- cocos2dx 仿射变换
AffineTransform __CCAffineTransformMake(float a, float b, float c, float d, float tx, float ty) { Af ...
- 关于knockout下拉多选值的应用
在最近的开发过程中,应用了一些关于knockout的下拉项目. 关于下拉多选的开发在这里做一个记录. 下面直接上代码 添加的时候,无需给初始值 --viewmodel function ViewMod ...
- iscsi,nfs
存储概述 存储的目标 存储是根据不同的应用环境通过采取合理.安全.有效的方式将数据保存到某些介质上并能保证有效的访问. 一方面它是数据临时或长期驻留的物理媒介. 另一方面,它是保证数据完整安全存放的方 ...
- java8中的stream流遍历
比较for循环.迭代器.java8Stream流遍历的不同 package cnom.test.testUtils; import java.io.Serializable; import java. ...
- linux下卸载旧版本cmake安装新版本cmake
1.看当前cmake版本 cmake --version 2.卸载旧版本下的cmake apt-get autoremove cmake 3.安装新版面cmake http://www.cnblogs ...
- 解决httpclient设置代理ip之后请求无响应的问题
httpclient这个工具类对于大家来说应该都不陌生吧,最近在使用过程中出现了碰到一个棘手的问题,当请求的接口地址由http变成https之后,程序执行到 httpClient.execute(ht ...
- 如何对N个接口按比例压测
随着微服务盛行,公司的服务端项目也越来越多.单一的接口性能测试并不能准确反映某个服务的总体处理能力,在服务功能划分比较清晰的架构下,对于某一服务的总体性能测试也相对变得简单.下面分享一个对于某个模块对 ...
- asp.net core 3.x 通用主机是如何承载asp.net core的-上
一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...