Hibernate5.2关联关系之单向多对一(二)

Hibernate5.2之单向一对多(二)

一. 简介

  在本篇博文中笔者会在上一篇博客的代码基础上进行修改,本篇文章将介绍单向的一对多。

二. hbm文件的方式

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.demo.hibernate.one2many.Customer" table="customer">
        <id name="id" type="int">
            <generator class="sequence">
                <param name="sequence_name">cus_order_seq</param>
            </generator>
        </id>
        <property name="name" type="string" column="name"></property>
        <property name="phoneNum" type="string" column="phone_number"></property>

    </class>
</hibernate-mapping>

Order.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.demo.hibernate.one2many.Order" table="orders">
        <id name="id" type="int">
            <generator class="sequence">
                <param name="sequence_name">cus_order_seq</param>
            </generator>
        </id>
        <property name="orderId" column="order_id" type="string"></property>
        <property name="createTime" column="create_time" type="timestamp"></property>
        <many-to-one name="customer" class="com.demo.hibernate.one2many.Customer" column="customer_id"></many-to-one>
    </class>
</hibernate-mapping>

三. 注解的方式

Customer.java

@Entity
@Table(name="customer")
public class Customer {
    @Id
    @Column(name="id")
    @SequenceGenerator(name="sequenceGenerator", sequenceName="cus_order_seq", allocationSize=1)
    @GeneratedValue(generator="sequenceGenerator")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="phone_number")
    private String phoneNum;

    //setter and getter
}

Order.java

@Entity
@Table(name="orders")
public class Order {
    @Id
    @Column(name="id")
    @SequenceGenerator(name="sequenceGenerator", sequenceName="cus_order_seq", allocationSize=1)
    @GeneratedValue(generator="sequenceGenerator")
    private int id;

    @Column(name="order_id")
    private String orderId;

    @Column(name="create_time")
    @Type(type="timestamp")
    private Date createTime;

    @ManyToOne(fetch=FetchType.LAZY)  //注解的方式需要指定延迟加载策略
    @JoinColumn(name="customer_id")
    private Customer customer;

    //setter and getter
}

四.测试代码

A.保存

@Test
public void save(){
    Transaction tx = session.beginTransaction();
    Customer customer = new Customer();
    customer.setName("AAAAA");
    customer.setPhoneNum("334411");

    Order order = new Order();
    order.setCreateTime(new Date());
    order.setOrderId("A");
    order.setCustomer(customer);

    Order order1 = new Order();
    order1.setCreateTime(new Date());
    order1.setOrderId("B");
    order1.setCustomer(customer);

    session.save(customer);
    session.save(order);
    session.save(order1);
    tx.commit();}

B.get方式

@Test
public void get(){
    Order order = session.get(Order.class, 17);
    System.out.println("查询Customer的SQL已经发送");
    System.out.println(order.getOrderId() + "::" + order.getCreateTime());
    Customer customer = order.getCustomer();
    System.out.println("查询Customer的SQL还未发送,因为延迟加载,只有当在使用Customer的时候才会发送SQL");
    System.out.println(customer.getName() + "::" + customer.getPhoneNum());
}

C.load方式

@Test
public void load(){
    Order order = session.load(Order.class, 17);
    System.out.println("查询Order的SQL还未发送,只有当使用的时候才会放松SQL");
    System.out.println(order.getOrderId() + "::" + order.getCreateTime());
    Customer customer = order.getCustomer();
    System.out.println("查询Order的Customer还未发送,因为延迟加载,只有当在使用Customer的时候才会发送SQL");
    System.out.println(customer.getName() + "::" + customer.getPhoneNum());
}

D.delete(删除)

@Test
public void delete(){
    Order order = new Order();
    order.setId(17);
    Transaction tx = session.beginTransaction();
    session.delete(order);
    tx.commit();
}

E.update(更新)

@Test
public void update(){
    Order order = new Order();
    order.setId(18);
    order.setCreateTime(new Date());
    order.setOrderId("N");

    Transaction tx = session.beginTransaction();
    session.update(order);
    tx.commit();
}
时间: 2024-10-12 19:21:52

Hibernate5.2关联关系之单向多对一(二)的相关文章

Hibernate5.2关联关系之单向一对多(一)

Hibernate5.2之单向一对多 一. 简介    Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibernate相关的系列文章,可能最近今年项目上基本上没怎么用Hibernate,包括身边的很多人都在唱衰Hibernate,觉得他笨重.低效,但是笔者认为这都不影响其在我心目中的地位,以及他当初给笔者所带来的震撼,也影响千千万万的程序员.本系列博客中没有关于Hibernate原理性的东西的讲解,只是一

6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)

单向多对一的关联关系 具体体现:n的一方有1的引用,1的一方没有n的集合属性 举个例子:订单Order和顾客Customer是一个单向多对一的关联关系.Order是n的一方,有对Customer的引用:而Customer作为1的一方却没有Order的集合属性. 主要是对n的一方使用@ManyToOne和@JoinColumn注解.而1的一方不需要做任何修改.具体的映射方法: 1.采用@ManyToOne注解映射多对一的关联关系,默认情况下采用“左外连接”的方式进行加载.可以通过配置@ManyTo

Hibernate单向“多对一”关联

1. 基于外键关联的单向"多对一"关联是最常见的单向关联其中指定many-to-one的unique="true",为单向"一对一",不指定就是单向"多对一" <class name="Person">    <id name="id" column="personId"><generator class="native&quo

(十三)Hibernate中的多表操作(3):单向多对多

多对多的处理方式是,有一张中间表,中间表保存两个多方之间的关系.首先来看实际应用场景:在之前开发的系统中,应用了基于角色的控制访问,也就是RBAC模型,一个用户可能存在多种角色,一种角色也可能有多个用户,所以用户和角色之间是一个多对多的关系. 案例一:  使用注解方式实现多对多关系 RoleBean.java package bean; import java.io.Serializable; import java.util.HashSet; import java.util.Set; imp

Mybatis单向多对一

一.假定一个父母有多个孩子,那父母和孩子对应关系为1对多. 二. 1.添加依赖包,参考上篇文章 Mybatis+mysql入门使用 2.初始化数据库和初始数据,以mysql为例 DROP DATABASE IF EXISTS moy_mybatis; CREATE DATABASE moy_mybatis CHARACTER SET UTF8; USE moy_mybatis; DROP TABLE IF EXISTS t_children; CREATE TABLE t_children( c

Hibernate单向多对多

最近做一个OA系统,用到了Hibernate框架,我发现,权限和角色的关系是一种多对多的关系,一个权限可以分配给多个角色,一个角色拥有多个权限. 多对多关系有两种,一种是单向的,一种是多向的.对于这个问题,曾经让我很犯难.单纯在语言上理解,会比较复杂,而从代码上理解,可能就会明白了. 下面模拟为角色授权的过程: 1,Hibernate使用Annotation 2,使用Junit进行测试. 3,使用Mysql作为后台数据库. 4,Hibernate不使用自动建表,也不采用反向工程. 过程 : 1,

Hibernate单向多对一级联删除引发的问题

Hibernate单向多对一在级联删除时,会出现一些问题. 下面模拟我遇到的问题: 这次模拟与之前的一次模拟方法一直,博客:http://blog.csdn.net/openjdk8/article/details/38424403 模拟场景:有一个部门表t_dept,职位表t_position. 需求:当删除部门表时,不管职位表有没数据,照样删除.删除职位表就直接删除. 1,建表: 建表: t_dept::部门表 t_position:职位表 CREATE TABLE t_dept(    d

hibernate中配置单向多对一关联,和双向一对多

什么是一对多,多对一?双向多对一和双向一对多是不是同一个概念? 是一个概念,双向多对一和双向一对多都是配置一个 一对多和多对一 一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多 多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是多 父亲是1  总结: 一对多就是: 1找到n 多对一就是: n找到1 有些人写概念写一大堆搞起我之前是一脸懵逼,还好弄懂了(手动滑稽) 配置单向多对一 通过上面我们可以了解,双向一对多是 1找n

JPA学习笔记-映射单向多对一的关联关系

Customer类 @Table(name="jpa_customer") @Entity public class Customer { @Column(name="id") @GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; @Column(name="last_name") private String lastName; private String