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的更多相关文章

  1. Hibernate(7)关联关系_单向1对n

    1.单向一对多(@OneToMany)关联是比较少用的(一般用双向一对多代替). 2.实体类: 1端:Publishers.java public class Publishers { private ...

  2. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  3. Hibernate —— 映射关联关系

    一.映射多对一关联关系. 1.单向的多对一 (1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户.从 Order 到 Customer 是多对一关联关 ...

  4. Hibernate的关联映射——单向1-N关联

    Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...

  5. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  6. Hibernate的关联映射——单向N-1关联

    Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...

  7. JPA(六):映射关联关系------映射单向一对多的关联关系

    映射单向一对多的关联关系 新建项目项目请参考<JPA(二):HellWord工程>,基于上一章讲解的<JPA(五):映射关联关系------映射单向多对一的关联关系>中的例子进 ...

  8. hibernate一对一外键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  9. hibernate一对一主键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. stl测试

    以下测试都在学校电脑进行 我觉得应该比考试机器慢一点.. 1.map map的速度测出来和放入数值大小有很大关系 比如 #include <bits/stdc++.h> using nam ...

  2. python全栈开发day72-django之Form组件

    一.ajax 1. 复习JSON 1. JSON是什么? 一种数据格式,和语言无关的数据格式. 2. Python里面转换 1. Python对象 --> 字符串 import json 字符串 ...

  3. Android 开发随笔

    1 获取屏幕尺寸 WindowManager wm = this.getWindowManager();viewWidth = wm.getDefaultDisplay().getWidth();vi ...

  4. UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 题目传送门 - UOJ#23 题意 给定一个有 n 个节点的仙人掌(可能有重边). 对于所有 ...

  5. BigInteger的使用

    [构造方法] BigInteger(String val) :将 BigInteger 的十进制字符串表示形式转换为 BigInteger. [常用方法] 1)add(BigInteger val): ...

  6. P1434 [SHOI2002]滑雪 dfs

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  7. LoadRunner之IP欺骗

     一.启动IP欺骗,弹出提示窗口:      二.将本机改为静态IP: 1.查看当前的IP相关信息: 2.更改IP:  三.正式设置模拟IP号段: 1.重复步骤一,会弹出如下弹窗,选择第二项并下一步: ...

  8. day 51 js-2 函数,对象,正则 (定时器示例)

    本文转载自cnblogs.liwenzhou-----哪吒博客 先来一个定时器让我们看看函数的效果: <script src="/js/jquery-3.2.1.min.js" ...

  9. java添加多个水印

    package com.zhx.util.imgutil; import com.zhx.util.stringutil.ArithUtil; import net.coobird.thumbnail ...

  10. Postman 使用技巧之多环境测试及接口依赖关系处理

    一.前言 在日常开发中,除了正常的单元测试,某些情况我们还需要测试 HTTP 接口,团队中目前使用的是「 Postman 」这款 API调试 . HTTP 请求工具.通常我们将经常要测试的接口按照项目 ...