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. 期货大赛项目|四,MVC的数据验证

    上图先看下效果 样式先不说,先了解下数据验证是怎么实现的 一 必须是强类型的视图 二 这些显示提示的话语,都在强类型的实体中 三 必须使用Html.BeginForm或者Html.AjaxBeginF ...

  2. 【SpringBoot】常用注解

    @EnableAutoConfiguration 启动自动装载:使用了这个注解之后,所有引入的jar的starters都会被自动注入.这个类的设计就是为starter工作的. @RestControl ...

  3. linux下几个常用软件

    Ubuntu 软件包地址 https://packages.ubuntu.com/ 一. 字体 不管是雅黑还是宋体,从windows cp过来后, 直接双击打开并安装 二. Meld 可视的diff和 ...

  4. ubuntud安装Adobe Flash Player / Plugin

    1.https://get.adobe.com/flashplayer/ , select tar.gz for other Linux, download 2.Unpack the tar.gz f ...

  5. 一起学Hadoop——Hadoop的前世今生

    Hadoop是什么? Hadoop是一个处理海量数据的开源框架.2002年Nutch项目面世,这是一个爬取网页工具和搜索引擎系统,和其他众多的工具一样,都遇到了在处理海量数据时效率低下,无法存储爬取网 ...

  6. Codeforces 915G Coprime Arrays 莫比乌斯反演 (看题解)

    Coprime Arrays 啊,我感觉我更本不会莫比乌斯啊啊啊, 感觉每次都学不会, 我好菜啊. #include<bits/stdc++.h> #define LL long long ...

  7. GFS 安装使用

    准备环境: 1.OS: Centos:7.2x86_64 2.主机 server1: 192.168.30.41 wohaoshuai1 server2: 192.168.30.42 wohaoshu ...

  8. Selenium自动化测试框架的搭建

          说 起自动化测试,我想大家都会有个疑问,要不要做自动化测试? 自动化测试给我们带来的收益是否会超出在建设时所投入的成本,这个嘛别说是我,即便是高手也很难回答,自动化测试的初衷是美好的,而测 ...

  9. css3实现旋转表

    如图所示: css部分: <style> #clock{width:100px; height:100px; border-radius:50%; border:4px solid bla ...

  10. mysql group_concat时间用法

    第一张表的worksId在第二张表中对应多条数据,需要将每条数据的日期作为结果查询出来,一个作为“初审时间”,另一个作为“复审时间”: 可以使用group_concat 和 group by 来进行分 ...