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