hibernate詳解(九)一對(duì)多的關(guān)聯(lián)關(guān)系

Set元素中的inverse屬性

  • 默認(rèn)inverse = false,子表的外鍵由父表來(lái)進(jìn)行維護(hù),會(huì)出現(xiàn)多條UPDATE語(yǔ)句筐高,用父表的主鍵來(lái)更新子表的外鍵彻桃,這樣子表的外鍵就不會(huì)為null
  • 當(dāng)inverse = true時(shí),子表的外鍵由子表來(lái)維護(hù)喘蟆,不會(huì)出現(xiàn)update語(yǔ)句钉鸯,這樣外鍵可能會(huì)出現(xiàn)null
    注意:在多對(duì)多的情況下吧史,inverse一定要設(shè)置為true,在任何一方都可以唠雕。

代碼如下:
分別創(chuàng)建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 : 連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)  -->
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        
          <!-- hibernate.connection.url : 連接數(shù)據(jù)庫(kù)的地址,路徑 -->
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
        
          <!-- hibernate.connection.username : 連接數(shù)據(jù)庫(kù)的用戶名 -->
        <property name="connection.username">system</property>
        
          <!-- hibernate.connection.password : 連接數(shù)據(jù)庫(kù)的密碼 -->
        <property name="connection.password">root</property>
        
          <!-- show_sql: 操作數(shù)據(jù)庫(kù)時(shí),會(huì) 向控制臺(tái)打印sql語(yǔ)句 -->
        <property name="show_sql">true</property>
        
          <!-- 數(shù)據(jù)庫(kù)方言配置 org.hibernate.dialect.Oracle10gDialect (選擇最短的)-->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        
          <!-- 加載配置文件的pojo類贸营,否則找不到吨述,報(bào)錯(cuò), 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>

測(cè)試類: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();
        }
    }

}

無(wú)標(biāo)題.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钞脂,隨后出現(xiàn)的幾起案子揣云,更是在濱河造成了極大的恐慌,老刑警劉巖冰啃,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵再,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡亿笤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門栋猖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)净薛,“玉大人,你說(shuō)我怎么就攤上這事蒲拉∷喟荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雌团,是天一觀的道長(zhǎng)燃领。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锦援,這世上最難降的妖魔是什么猛蔽? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮灵寺,結(jié)果婚禮上曼库,老公的妹妹穿的比我還像新娘。我一直安慰自己略板,他們只是感情好毁枯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叮称,像睡著了一般种玛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓤檐,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天赂韵,我揣著相機(jī)與錄音,去河邊找鬼距帅。 笑死右锨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碌秸。 我是一名探鬼主播绍移,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼悄窃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蹂窖?” 一聲冷哼從身側(cè)響起轧抗,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞬测,沒(méi)想到半個(gè)月后横媚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡月趟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年灯蝴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孝宗。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穷躁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出因妇,到底是詐尸還是另有隱情问潭,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布婚被,位于F島的核電站狡忙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏址芯。R本人自食惡果不足惜灾茁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谷炸。 院中可真熱鬧删顶,春花似錦、人聲如沸淑廊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)季惩。三九已至录粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間画拾,已是汗流浹背啥繁。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留青抛,地道東北人旗闽。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親适室。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫡意,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法捣辆,內(nèi)部類的語(yǔ)法蔬螟,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法汽畴,線程的語(yǔ)...
    子非魚_t_閱讀 31,645評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11
  • Hibernate: 一個(gè)持久化框架 一個(gè)ORM框架 加載:根據(jù)特定的OID,把一個(gè)對(duì)象從數(shù)據(jù)庫(kù)加載到內(nèi)存中OID...
    JHMichael閱讀 1,977評(píng)論 0 27
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理旧巾,服務(wù)發(fā)現(xiàn),斷路器忍些,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 阿西 是不是感覺(jué)很受傷 沒(méi)關(guān)系罢坝,關(guān)注“石榴微電影”微信公眾號(hào)绳匀,ID:shiliuweidianying 真正的好東...
    閑人電影閱讀 243評(píng)論 0 1