hibernate详解(九)一对多的关联关系

Set元素中的inverse属性

  • 默认inverse = false,子表的外键由父表来进行维护,会出现多条UPDATE语句,用父表的主键来更新子表的外键,这样子表的外键就不会为null
  • 当inverse = true时,子表的外键由子表来维护,不会出现update语句,这样外键可能会出现null
    注意:在多对多的情况下,inverse一定要设置为true,在任何一方都可以。

代码如下:
分别创建order表及orderline表

CREATE TABLE t_order(
    id NUMBER(10) PRIMARY KEY,
    ordered_date DATE NOT NULL,
    shipped_date DATE,
    total NUMBER(10,2)
);

CREATE TABLE t_orderline(
    id NUMBER(10) PRIMARY KEY,
    price NUMBER(10,2),
    quantity NUMBER(10),
    product VARCHAR2(30),
    order_id NUMBER(10) REFERENCES t_order(id)
);

CREATE SEQUENCE t_order_seq
START WITH 1
INCREMENT BY 1;

CREATE SEQUENCE t_orderline_seq
START WITH 1
INCREMENT BY 1;

Order类:

package com.iotek.basic.association.one2many.pojo;

import java.io.Serializable;
import java.sql.Date;
import java.util.HashSet;
import java.util.Set;

public class Order implements Serializable {
    
    private static final long serialVersionUID = 1807690077527938744L;
    private Long id;
    private Date orderedDate;
    private Date shippedDate;
    private Double total;
    private Set<Orderline> orderlines = new HashSet<Orderline>();
    
    public Order() {}

    public Order(Long id, Date orderedDate, Date shippedDate, Double total, Set<Orderline> orderlines) {
        super();
        this.id = id;
        this.orderedDate = orderedDate;
        this.shippedDate = shippedDate;
        this.total = total;
        this.orderlines = orderlines;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getOrderedDate() {
        return orderedDate;
    }

    public void setOrderedDate(Date orderedDate) {
        this.orderedDate = orderedDate;
    }

    public Date getShippedDate() {
        return shippedDate;
    }

    public void setShippedDate(Date shippedDate) {
        this.shippedDate = shippedDate;
    }

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }

    public Set<Orderline> getOrderlines() {
        return orderlines;
    }

    public void setOrderlines(Set<Orderline> orderlines) {
        this.orderlines = orderlines;
    }

    @Override
    public String toString() {
        return "Order [id=" + id + ", orderedDate=" + orderedDate + ", shippedDate=" + shippedDate + ", total=" + total
                + ", orderlines=" + orderlines + "]";
    }
    
    
    
}


Orderline类:

package com.iotek.basic.association.one2many.pojo;

import java.io.Serializable;

public class Orderline implements Serializable {

    private static final long serialVersionUID = -3664371204911964913L;
    private Long id;
    private Double price;
    private Long quantity;
    private String product;
    private Order order;
    
    public Orderline() {}

    public Orderline(Long id, Double price, Long quantity, String product, Order order) {
        super();
        this.id = id;
        this.price = price;
        this.quantity = quantity;
        this.product = product;
        this.order = order;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Long getQuantity() {
        return quantity;
    }

    public void setQuantity(Long quantity) {
        this.quantity = quantity;
    }

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    @Override
    public String toString() {
        return "Orderline [id=" + id + ", price=" + price + ", quantity=" + quantity + ", product=" + product
                + "]";
    }
    
    
}


Order.hmb.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 package="com.iotek.basic.association.one2many.pojo">
    <class name="Order" table="T_ORDER">
        <id name="id" column="ID" type="long">
            <generator class="sequence">
                <param name="sequence">t_order_seq</param>
            </generator>
        </id>
        
        <property name="orderedDate" type="date" column="ORDERED_DATE"/>
        <property name="shippedDate" type="date" column="SHIPPED_DATE"/>
        <property name="total" type="double" column="TOTAL"/>
        
        <set name="orderlines" cascade="all" inverse="true">
            <key column="ORDER_ID"/>
            <one-to-many class="Orderline"/>
        </set>
    </class>
</hibernate-mapping>

Orderline.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 package="com.iotek.basic.association.one2many.pojo">
    <class name="Orderline" table="T_ORDERLINE">
        <id name="id" column="ID" type="long">
            <generator class="sequence">
                <param name="sequence">t_orderline_seq</param>
            </generator>
        </id>
        
        <property name="price" type="double" column="PRICE"/>
        <property name="quantity" type="long" column="QUANTITY"/>
        <property name="product" type="string" column="PRODUCT"/>
        <many-to-one name="order" column="ORDER_ID"></many-to-one>
    </class>
</hibernate-mapping>

hibernate配置文件:hibernate.cfg.xml

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

<hibernate-configuration>
    <session-factory>
        <!-- property 元素用于配置Hibernate中的属性 键:值 -->
        
          <!-- hibernate.connection.driver_class : 连接数据库的驱动  -->
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        
          <!-- hibernate.connection.url : 连接数据库的地址,路径 -->
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
        
          <!-- hibernate.connection.username : 连接数据库的用户名 -->
        <property name="connection.username">system</property>
        
          <!-- hibernate.connection.password : 连接数据库的密码 -->
        <property name="connection.password">root</property>
        
          <!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
        <property name="show_sql">true</property>
        
          <!-- 数据库方言配置 org.hibernate.dialect.Oracle10gDialect (选择最短的)-->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        
          <!-- 加载配置文件的pojo类,否则找不到,报错, unknow entity -->
        <mapping resource="com/iotek/basic/pojo/Student.hbm.xml"/>
        <mapping resource="com/iotek/basic/association/one2one/pojo/Passport_PK.hbm.xml"/>
        <mapping resource="com/iotek/basic/association/one2one/pojo/Person_PK.hbm.xml"/>
        <mapping resource="com/iotek/basic/association/one2many/pojo/Order.hbm.xml"/>
        <mapping resource="com/iotek/basic/association/one2many/pojo/Orderline.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

测试类:One2ManyTest.java:

package com.iotek.basic.association.one2many.pojo;

import java.sql.Date;
import java.util.Calendar;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.iotek.basic.common.HibernateSessionFactory;

public class One2ManyTest {

    public static void main(String[] args) {
        Orderline orderline1 = new Orderline();
        orderline1.setProduct("jdbc");
        orderline1.setPrice(12.24);
        orderline1.setQuantity(5L);
        
        Orderline orderline2 = new Orderline();
        orderline2.setProduct("java");
        orderline2.setPrice(24.88);
        orderline2.setQuantity(20L);
        
        Order order = new Order();
        order.setOrderedDate(new Date(System.currentTimeMillis()));
        Calendar c1 = Calendar.getInstance();
        c1.set(Calendar.DAY_OF_MONTH, c1.get(Calendar.DAY_OF_MONTH) + 3);
        order.setShippedDate(new Date(c1.getTimeInMillis()));
        
        order.getOrderlines().add(orderline1);
        order.getOrderlines().add(orderline2);
        orderline1.setOrder(order);
        orderline2.setOrder(order);
        
        order.setTotal(
                orderline1.getPrice()*orderline1.getQuantity() + 
                orderline2.getPrice()*orderline2.getQuantity());
        
        Session session = HibernateSessionFactory.getSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.save(order);
            transaction.commit();
        } catch (Exception e) {
            e.printStackTrace();
            transaction.rollback();
        }
    }

}

无标题.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,608评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,809评论 0 11
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,963评论 0 27
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • 阿西 是不是感觉很受伤 没关系,关注“石榴微电影”微信公众号,ID:shiliuweidianying 真正的好东...
    闲人电影阅读 241评论 0 1