1. 程式人生 > >hibernate多對一查詢

hibernate多對一查詢

1.實體類

package com.lanou3g.bean;
/*
 * CREATE TABLE `cst_linkman` (
  `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '聯絡人編號(主鍵)',
  `lkm_name` varchar(16) DEFAULT NULL COMMENT '聯絡人姓名',
  `lkm_cust_id` bigint(32) NOT NULL COMMENT '客戶id',
  `lkm_gender` char(1) DEFAULT NULL COMMENT '聯絡人性別',
  `lkm_phone` varchar(16) DEFAULT NULL COMMENT '聯絡人辦公電話',
  `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '聯絡人手機',
  `lkm_email` varchar(64) DEFAULT NULL COMMENT '聯絡人郵箱',
  `lkm_qq` varchar(16) DEFAULT NULL COMMENT '聯絡人qq',
  `lkm_position` varchar(16) DEFAULT NULL COMMENT '聯絡人職位',
  `lkm_memo` varchar(512) DEFAULT NULL COMMENT '聯絡人備註',
  PRIMARY KEY (`lkm_id`),
  KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
  CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
 */
public class LinkMan { private Long lkm_id; private String lkm_name; private Long lkm_cust_id; private Character lkm_gender; private String lkm_phone; private String lkm_mobile; private String lkm_email; private String lkm_qq; private String lkm_position; private
String lkm_memo; // 多表表示跟一表的關係 private Customer customer; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public LinkMan() { super(); // TODO Auto-generated constructor stub
} public LinkMan(Long lkm_id, String lkm_name, Long lkm_cust_id, Character lkm_gender, String lkm_phone, String lkm_mobile, String lkm_email, String lkm_qq, String lkm_position, String lkm_memo) { super(); this.lkm_id = lkm_id; this.lkm_name = lkm_name; this.lkm_cust_id = lkm_cust_id; this.lkm_gender = lkm_gender; this.lkm_phone = lkm_phone; this.lkm_mobile = lkm_mobile; this.lkm_email = lkm_email; this.lkm_qq = lkm_qq; this.lkm_position = lkm_position; this.lkm_memo = lkm_memo; } public Long getLkm_id() { return lkm_id; } public void setLkm_id(Long lkm_id) { this.lkm_id = lkm_id; } public String getLkm_name() { return lkm_name; } public void setLkm_name(String lkm_name) { this.lkm_name = lkm_name; } public Long getLkm_cust_id() { return lkm_cust_id; } public void setLkm_cust_id(Long lkm_cust_id) { this.lkm_cust_id = lkm_cust_id; } public Character getLkm_gender() { return lkm_gender; } public void setLkm_gender(Character lkm_gender) { this.lkm_gender = lkm_gender; } public String getLkm_phone() { return lkm_phone; } public void setLkm_phone(String lkm_phone) { this.lkm_phone = lkm_phone; } public String getLkm_mobile() { return lkm_mobile; } public void setLkm_mobile(String lkm_mobile) { this.lkm_mobile = lkm_mobile; } public String getLkm_email() { return lkm_email; } public void setLkm_email(String lkm_email) { this.lkm_email = lkm_email; } public String getLkm_qq() { return lkm_qq; } public void setLkm_qq(String lkm_qq) { this.lkm_qq = lkm_qq; } public String getLkm_position() { return lkm_position; } public void setLkm_position(String lkm_position) { this.lkm_position = lkm_position; } public String getLkm_memo() { return lkm_memo; } public void setLkm_memo(String lkm_memo) { this.lkm_memo = lkm_memo; } @Override public String toString() { return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_cust_id=" + lkm_cust_id + ", lkm_gender=" + lkm_gender + ", lkm_phone=" + lkm_phone + ", lkm_mobile=" + lkm_mobile + ", lkm_email=" + lkm_email + ", lkm_qq=" + lkm_qq + ", lkm_position=" + lkm_position + ", lkm_memo=" + lkm_memo + "]"; } }
package com.lanou3g.bean;

import java.util.HashSet;
import java.util.Set;

/*
CREATE TABLE `cst_customer` (
`cust_id` BIGINT (32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
`cust_name` VARCHAR (32) NOT NULL COMMENT '客戶名稱(公司名稱)',
`cust_source` VARCHAR (32) DEFAULT NULL COMMENT '客戶資訊來源',
`cust_industry` VARCHAR (32) DEFAULT NULL COMMENT '客戶所屬行業',
`cust_level` VARCHAR (32) DEFAULT NULL COMMENT '客戶級別',
`cust_linkman` VARCHAR (64) DEFAULT NULL COMMENT '聯絡人',
`cust_phone` VARCHAR (64) DEFAULT NULL COMMENT '固定電話',
`cust_mobile` VARCHAR (16) DEFAULT NULL COMMENT '行動電話',
PRIMARY KEY (`cust_id`)
*/
public class Customer {
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkman;
    private String cust_phone;
    private String cust_mobile;
    // 表示一對多關係的容器
    // 注意:容器你必須初始化了 才能儲存東西
    private Set<LinkMan> linkMans = new HashSet<>();
    public Set<LinkMan> getLinkMans() {
        return linkMans;
    }
    public void setLinkMans(Set<LinkMan> linkMans) {
        this.linkMans = linkMans;
    }
    public Customer() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Customer(Long cust_id, String cust_name, String cust_source, String cust_industry, String cust_level,
            String cust_linkman, String cust_phone, String cust_mobile) {
        super();
        this.cust_id = cust_id;
        this.cust_name = cust_name;
        this.cust_source = cust_source;
        this.cust_industry = cust_industry;
        this.cust_level = cust_level;
        this.cust_linkman = cust_linkman;
        this.cust_phone = cust_phone;
        this.cust_mobile = cust_mobile;
    }
    public Long getCust_id() {
        return cust_id;
    }
    public void setCust_id(Long cust_id) {
        this.cust_id = cust_id;
    }
    public String getCust_name() {
        return cust_name;
    }
    public void setCust_name(String cust_name) {
        this.cust_name = cust_name;
    }
    public String getCust_source() {
        return cust_source;
    }
    public void setCust_source(String cust_source) {
        this.cust_source = cust_source;
    }
    public String getCust_industry() {
        return cust_industry;
    }
    public void setCust_industry(String cust_industry) {
        this.cust_industry = cust_industry;
    }
    public String getCust_level() {
        return cust_level;
    }
    public void setCust_level(String cust_level) {
        this.cust_level = cust_level;
    }
    public String getCust_linkman() {
        return cust_linkman;
    }
    public void setCust_linkman(String cust_linkman) {
        this.cust_linkman = cust_linkman;
    }
    public String getCust_phone() {
        return cust_phone;
    }
    public void setCust_phone(String cust_phone) {
        this.cust_phone = cust_phone;
    }
    public String getCust_mobile() {
        return cust_mobile;
    }
    public void setCust_mobile(String cust_mobile) {
        this.cust_mobile = cust_mobile;
    }
    @Override
    public String toString() {
        return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
                + ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_linkman=" + cust_linkman
                + ", cust_phone=" + cust_phone + ", cust_mobile=" + cust_mobile + "]";
    }
}

2. Customter.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.lanou3g.bean">
    <class name="LinkMan" table="cst_linkman">
        <id name="lkm_id" column="lkm_id">
            <generator class="native"></generator>
        </id>
        <property name="lkm_name" column="lkm_name"></property>
        <property name="lkm_gender" column="lkm_gender"></property>
        <property name="lkm_phone" column="lkm_phone"></property>
        <property name="lkm_mobile" column="lkm_mobile"></property>
        <property name="lkm_email" column="lkm_email"></property>
        <property name="lkm_qq" column="lkm_qq"></property>
        <property name="lkm_position" column="lkm_position"></property>
        <property name="lkm_memo" column="lkm_memo"></property>

        <!-- 配置表關係 -->
        <!-- 
            name : 表示關係的物件的屬性名
            column : 表中外來鍵名
            class : 多對一關係中 對應的實體類名
            注意:外來鍵的屬性值只能配一次
         -->
        <many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
    </class>
</hibernate-mapping>
<?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.lanou3g.bean">
    <class name="Customer" table="cst_customer">
        <id name="cust_id" column="cust_id">
            <generator class="native"></generator>
        </id>
        <property name="cust_name" column="cust_name"></property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_linkman" column="cust_linkman"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
        <!-- 配置表示關係的容器 -->
        <!-- 
            name: 實體類中容器的屬性名
            column: 表中的外來鍵名
            class: 表示一對多中 多表的類(全類名)
            inverse 控制是否維護外來鍵
            inverse 預設值維護外來鍵的關係 預設值是false
            結語:inverse可以減少hibernate無用的操作

            cascade:級連操作
            save-update
            delete
            all == save-update + delete

            建議:如果要用級聯操作就用sava-update慎用delete
         -->
        <set name="linkMans" cascade="save-update">
            <key column="lkm_cust_id"></key>
            <one-to-many class="LinkMan" />
        </set>
    </class>
</hibernate-mapping>

3.hibernater測試多對一

package com.lanou3g.bean;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

public class Demo01 {
    /*
     * 新增一個客戶 兩個聯絡人
     */
    @Test
    public void fun1() {
        // 獲取session 
        Session session = HibernateUtils.getSession();
        // 開啟事務
        Transaction transaction = session.beginTransaction();
        // 建立客戶
        Customer customer = new Customer();
        customer.setCust_name("藍歐科技");
        // 建立聯絡人
        LinkMan l1 = new LinkMan();
        l1.setLkm_name("楊虎");
        LinkMan l2 = new LinkMan();
        l2.setLkm_name("劉凱");
        // 新增實體類中的關係
        // 把聯絡人新增到集合中
        customer.getLinkMans().add(l1);
        customer.getLinkMans().add(l2);
        // 給聯絡人設定客戶
        l1.setCustomer(customer);
        l2.setCustomer(customer);
        // 儲存到資料庫
        session.save(customer);
        session.save(l1);
        session.save(l2);
        // 提交事務
        transaction.commit();
        // 關閉資源
        session.close();
    }
    // 為客戶id為1的人刪除聯絡人id為2
    @Test
    public void fun2() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        // 獲取id為1的客戶
        // 持久態 在事務提交的時候 如果該物件被修改了
        // 那麼修改的資料會被同步到資料中
        Customer customer = session.get(Customer.class, 1l);
        // 獲取id為2的聯絡人
        LinkMan linkMan = session.get(LinkMan.class, 2l);
        // 處理實體類中的關係
        customer.getLinkMans().remove(linkMan);
        linkMan.setCustomer(null);
        // 從資料庫中刪除
        session.delete(linkMan);

        //session.update(customer);
        transaction.commit();
        session.close();
    }

    // 為客戶id為1 增加聯絡人
    /*
     * 列印的插入語句是linkman 在維護自己的表
     * 並且在插入的時候 已經插入了外來鍵(外來鍵已經有了)
     * 
     * 對hibernate執行的SQL語句的優化
     * 列印的更新語句 是Customer來維護從而打印出來的
     * 這裡對外來鍵的維護 倆個表都維護一遍 造成了多餘的SQL語句操作
     */
    @Test
    public void fun3() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Customer customer = session.get(Customer.class, 1l);
        //建立新的聯絡人
        LinkMan l3 = new LinkMan();
        l3.setLkm_name("龍哥");
        //處理實體類中的關係
        l3.setCustomer(customer);
        customer.getLinkMans().add(l3);
        //儲存到資料庫
        session.save(l3);
        session.update(customer);
        transaction.commit();
        session.close();
    }
    //新增客戶 和 聯絡人(李勝運)
    //級連操作:可以使你減少幾行程式碼的工作量
    @Test
    public void fun4() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Customer customer = new Customer();
        customer.setCust_name("豐收科技");
         LinkMan linkMan = new LinkMan();
         linkMan.setLkm_name("你隨意");
         //設定實體類
         customer.getLinkMans().add(linkMan);
         linkMan.setCustomer(customer);
        //儲存到資料庫
        session.save(customer);
        session.save(linkMan);


        transaction.commit();
        session.close();
    }
    //級連 刪除id為1客戶同時刪除聯絡人
    @Test
    public void fun5() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

          Customer customer = session.get(Customer.class, 1L);
          session.delete(customer);

        transaction.commit();
        session.close();
    }

}

相關推薦

hibernate查詢

1.實體類 package com.lanou3g.bean; /* * CREATE TABLE `cst_linkman` ( `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '聯絡人編號(

Hibernate 超簡單的一對查詢

這裡使用的Teacher類和Student類(假設一個Teacher對應多個學生,一個學生對應一個老師)所需jar包開始建表1(表名 teacher)2(表名 student)主鍵都為自增長建立實體類Teacher類package com.bright.po; import

mybatis10--自連接查詢

所有 bsp from 測試 java out void pan tid 查詢老師對應的所有導師的信息 在09的基礎上修改dao和mapper文件 public interface TeacherDao { /** * 根據老師的編號查詢所有的

(十八)Mybatis自關聯查詢方式

注:程式碼已託管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,專案是mybatis-14-oneself-many2one,需要自取,需要配置maven環境以及mysql環境(sql語句在resource下的test.s

Sqlalchemy查詢AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object...

Children.query.filter(Children.parent.id==1) 報錯: AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Child

Hibernate、雙向關係、控制反轉、級聯配置

Hibernate多對一關係配置 Students配置檔案: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0

SSH學習四 Hibernate的關係 + 增刪改查

多對一關係實現起來不難,只需要在“多”的一方宣告外來鍵,宣告外來鍵在類的對映檔案實現。 下面以老師學生為例,老師是1,學生是多 有一個有趣的地方,在Student類裡面,沒有宣告teacherid這個屬性,但是隻要在配置檔案聲明瞭外來鍵,那麼就算類裡面沒有外來鍵,配置檔案

hibernate關聯和一對關聯

1. 多對一的單向關聯 從訂單(order)到客戶(customer)的單向關聯 (多個訂單對應一個客戶) JavaBean: Customer public class Customer{ private Integer id; private String nam

SpringData JPA查詢

實體類: ①PaperStore類 package com.sssp.entity; import Java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedV

hibernate 雙向對映關係

Book類(圖書類):package com.hc.model; public class Book { private Integer id; private String name;

hibernate——和一對對映淺析

首先應該清楚多對一和一對多隻是站在不同的角度看待問題,其本質是一樣的。在思考這個問題的時候,不要把這兩個概念混在一起,這樣不容易理解,而要分開,站在不同的角度去解決同一個問題。 就拿員工和部門的例子來說,我們站在不同的角度,可能會遇到如下的幾種情況: 站在員工的角度看,是多對一的關係:  1、來了新員工,但

Hibernate遍歷物件的時候報java.lang.StackOverflowError錯誤

·在Hibernate中多對一關係,有時候不習慣使用debug,比較喜歡在控制檯打印出來物件。這個時候就喜歡在兩個物件裡面都重寫toString方法。這個時候變報了下面的這個錯誤。 java.lang.StackOverflowError at java.lang.In

MyBitis(iBitis)系列隨筆之四:表(查詢操作)

          前面幾篇部落格介紹的都是單表對映的一些操作,然而在我們的實際專案中往往是用到多表對映。至於多表對映的關鍵要用到mybitis的association來加以實現。           這篇介紹的是多表中的多對一表關聯查詢          

Hibernate

開發十年,就只剩下這套架構體系了! >>>   

hibernate關於映射和的hql查詢

nfa nat alt sso true chan select csdn exc public void queryCustomerbymerchantId(){ SessionFactory sf = HibernateUtil.getSessio

hibernate DetachedCriteria關聯 內連線查詢

前幾天在專案裡遇到了多對一關聯查詢的問題,現有vendor_info的site_code 欄位 和department裡面的dept_code欄位是相對應的. 需求是根據在vendor_info的site_code欄位顯示 該欄位在department的are

12-hibernate實戰 根據查詢員工獲取部門的資訊

static Employee query(int empId) { Session session = null; Transaction transaction = null; try { session=HibernateUtil.getSessi

Hibernate 一對 例項 及一些 問題(1)插入及查詢

 Clazz.java /** * */ package com.wonders.task.sample.bo; import java.util.Set; import javax.persistence.CascadeType; import javax.p

hibernate HQL 分頁 關聯查詢(一對單向, 雙向,

HQL的 分頁 1.首先我們準備好實體類: package cn.happy.hibernate04pagelist; import cn.happy.hibernate03hql.conEmp; import java.util.Date; /** * Creat

Hibernate單向“”關聯

額外 generator nat col 方式 單向 key null option 1. 基於外鍵關聯的單向“多對一”關聯是最常見的單向關聯其中指定many-to-one的unique="true",為單向“一對一”,不指定就是單向“多對一” <class name