Hibernate(6)关联关系_单向n对1
1.单向 n-1 关联只需从 n 的一端可以访问 1 的一端
2.实体类
n端:Order.java
public class Order {
private Integer orderId;
private String orderName;
//在n端的实体类中有1端的类型的属性
private Customer customer;
//省略getter和setter方法
...
}
1端:Customer.java
public class Customer {
private Integer customerId;
private String customerName;
//省略getter和setter方法
...
}
3.映射文件
n端:Order.hbm.xml
<hibernate-mapping package="com.withXml.manyToone.entity">
<class name="Order" table="ORDERS">
<id name="orderId" type="java.lang.Integer">
<column name="ORDER_ID" />
<generator class="native" />
</id>
<property name="orderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property>
<!-- 在n的一端映射n对1关联关系 -->
<many-to-one name="customer" class="Customer" column="CUSTOMER" cascade="save-update,delete"></many-to-one>
</class>
</hibernate-mapping>
1:端Customer.hbm.xml
<hibernate-mapping>
<class name="com.withXml.manyToone.entity.Customer" table="CUSTOMERS">
<id name="customerId" type="java.lang.Integer">
<column name="CUSTOMER_ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
</class>
</hibernate-mapping>
4.配置文件中添加Mapping元素
<!-- 配置映射文件时,这两种方法只能使用其中之一,同时使用会报错 -->
<!--使用配置文件时: 加载映射文件,注意使用的是斜杠作为分割符,有文件的后缀名 -->
<!-- 使用注解时:加载持久化类文件,注意使用的是圆点作为分割符,无文件的后缀名 -->
<mapping resource="com/withXml/manyToone/entity/Customer.hbm.xml"/>
<mapping resource="com/withXml/manyToone/entity/Order.hbm.xml"/>
5.CRUD测试
public class TestManyToOne {
//通常生产环境中不会定义Transaction对象 和Session对象为成员变量,因为会出现并发的问题,这是单元测试环境
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
/**
* 初始化Session
*/
@Before
public void init(){
//1.获取Configuration 对象
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
//2.获取ServiceRegistry 对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(configuration.getProperties()).
buildServiceRegistry();
//3.获取SessionFactory 对象,并在ServiceRegistry 对象中注册
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//4.获取Session 对象
session = sessionFactory.openSession();
//5.开启session事务
transaction = session.beginTransaction();
}
/**
* 关闭Session
*/
@After
public void destroy(){
transaction.commit();
session.close();
sessionFactory.close();
}
/**
* 执行保存操作时,先保存一的一端的对象,在保存多的一端的对象时,只有三条insert语句
* 执行保存操作时,先保存多的一端的对象,在保存一的一端的对象时,有三条insert语句和两条update语句,
*因为在插入多的一端无法确定外键值,所以只能等一的一端插入后,再更新
*/
@Test
public void testManyToOneSave(){
//客户
Customer customer = new Customer();
customer.setCustomerName("CC");
//订单一
Order order = new Order();
order.setOrderName("order-3");
//订单二
Order order2 = new Order();
order2.setOrderName("order-4");
//设定关联关系,从多的一端维护关联关系
order.setCustomer(customer);
order2.setCustomer(customer);
//执行保存操作,先保存一的一端,在保存多的一端,推荐
session.save(customer);
session.save(order);
session.save(order2);
//先保存多的一端,在保存一的一端,不推荐
// session.save(order);
// session.save(order2);
// session.save(customer);
}
/**
* 测试客户和订单之间的单向多对一的关联关系,查找操作
* 若查询多的一端的一个对象,则默认情况下,只查询多的一端的对象,而没有查询关联的对象,即一的一端的对象
*只有需要使用到关联的对象时,才发送相关的SQL语句,这就是Hibernate的懒加载机制
* 若在加载关联的对象时,把session关了,就会出现懒加载异常
*/
@Test
public void testManyToOneGet(){
Order order = (Order) session.get(Order.class, 1);
System.out.println("订单名称:" + order.getOrderName());
String name = order.getCustomer().getCustomerName();
System.out.println("订单:" + order.getOrderName() + "的客户是:" + name);
}
/**
* 测试修改操作
*/
@Test
public void testManyToOneUpdate(){
Order order = (Order) session.get(Order.class, 1);
order.getCustomer().setCustomerName("AAA");
}
/**
* 测试删除操作,删除时,不能从关联的一端进行删除,因为在多的一端的外键引用了一的一端
* 在多对一映射中,无法从1的一端删除,在一对多映射中,可以中1的一端删除记录,
*同时还会强制把n端的外键也删除
*/
@Test
public void testManyToOneDelete(){
//从一的一端,删除记录失败,因为一的一端外键被引用无法删除
// Customer customer = (Customer) session.get(Customer.class, 1);
// session.delete(customer);
//从多的一端删除记录
Order order = (Order) session.get(Order.class, 4);
session.delete(order);
}
/**
* 级联保存
*/
@Test
public void testManyToOneCascadeSave(){
//客户
Customer customer = new Customer();
customer.setCustomerName("CC");
//订单一
Order order = new Order();
order.setOrderName("order-3");
//订单二
Order order2 = new Order();
order2.setOrderName("order-4");
//设定关联关系,从多的一端维护关联关系
order.setCustomer(customer);
order2.setCustomer(customer);
//执行保存操作,先保存一的一端,在保存多的一端,推荐,设置cascade级联属性之后,
//仅只保存多端即可,从而省略1的一端,反之则不行因为没有一对多的的映射
// session.save(customer);
session.save(order);
session.save(order2);
}
}
单向n对1
总结:
n端:
①实体类中添加一个1端类型的属性
②映射文件中使用<many-to-one 映射数据库字段
1端:
①普通的javaBean
②映射文件,类属性和数据库字段一一映射即可
Hibernate(6)关联关系_单向n对1的更多相关文章
- Hibernate(7)关联关系_单向1对n
1.单向一对多(@OneToMany)关联是比较少用的(一般用双向一对多代替). 2.实体类: 1端:Publishers.java public class Publishers { private ...
- 009一对一 主键关联映射_单向(one-to-one)
009一对一 主键关联映射_单向(one-to-one) ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...
- Hibernate —— 映射关联关系
一.映射多对一关联关系. 1.单向的多对一 (1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户.从 Order 到 Customer 是多对一关联关 ...
- Hibernate的关联映射——单向1-N关联
Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...
- Hibernate的关联映射——单向1-1关联
Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...
- Hibernate的关联映射——单向N-1关联
Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...
- JPA(六):映射关联关系------映射单向一对多的关联关系
映射单向一对多的关联关系 新建项目项目请参考<JPA(二):HellWord工程>,基于上一章讲解的<JPA(五):映射关联关系------映射单向多对一的关联关系>中的例子进 ...
- hibernate一对一外键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- 【CF809D】Hitchhiking in the Baltic States
题意: 给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足t1<t2<...<tlent1<t2<...<tlen.最 ...
- 【AtCoder】Tenka1 Programmer Contest 2019
Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...
- Codeforces 844F Anti-Palindromize 最小费用流
Anti-Palindromize 想到网络流就差不多了, 拆拆点, 建建边. #include<bits/stdc++.h> #define LL long long #define f ...
- AtCoder Regular Contest 099 (ARC099) E - Independence 二分图
原文链接https://www.cnblogs.com/zhouzhendong/p/9224878.html 题目传送门 - ARC099 E - Independence 题意 给定一个有 $n$ ...
- 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义
一:任务 1.任务 常用的验证注解 自定义返回消息 自定义校验注解 二:Hibernate Validator 1.常见的校验注解 2.程序 测试类 /** * @throws Exception * ...
- Spring(四)使用注解注入Bean
注解简单介绍 是代码里面的特殊标记,使用注解完成功能. 注解写法@ 注解名称(属性名=属性值). 注解可以作用在类.方法.属性上面. 使用流程: 在ApplicationContext.xml中开启注 ...
- linux定时任务相关
定时任务所在文件夹 /etc/crontab 定时任务重启命令 service crond restart
- 在ArchLinux中安装MySQL
最近前端学习用到数据库的知识.鉴于MySQL被甲骨文收购的情况,我从MariaDB开始学习.操作系统Manjaro 17.1, 数据库版本MariaDB 10.1. 1. 安装MariaDb和其客户端 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
- PostgreSQL 在Ubuntu下如何修改postgres默认密码
Step1: 切换用户为postgres sudo su postgres Step2: 用postgres连接postgreSQL psql -U postgres Step3: 修改postgre ...