hibernate的一对一主键双向映射关系和外键双向映射关系(一)
主鍵關(guān)聯(lián)的重點是關(guān)聯(lián)的兩個表共享一個主鍵值。本例中采用,一個單位在網(wǎng)上的一個系統(tǒng)中注冊會員。
1,會員數(shù)據(jù)保存在會員表company中,每個會員的登錄賬號保存在表login中;
2,一個會員只有一個登錄賬號,一個登錄賬號只屬于一個會員,兩表是一對一的對應(yīng)關(guān)系;
company表如下:
生成company表的sql語句如下:
CREATE TABLE `company` ( `ID` int(4) NOT NULL AUTO_INCREMENT , `COMPANYNAME` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `LINKMAN` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `TELEPHONE` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `EMAIL` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`ID`) )login表如下:
生成login表的sql語句如下:
外鍵關(guān)聯(lián)的重點是:兩個表各自有不同的主鍵,但是其中一個表有一個外鍵引用另一個表的主鍵。即非主鍵是別人的主鍵就是該表的外鍵。
這個例子中:
1,客戶(Client)和客戶地址(Address)是外鍵關(guān)聯(lián)的一對一關(guān)系,分別對應(yīng)client表換個address表。
2,Client類在映射文件中的client_address為外鍵引用Address類的對應(yīng)表中的主鍵,咋一看書多對一關(guān)系,但是在Client類對應(yīng)的映射文件設(shè)置多對一對應(yīng)的屬性client_address時,設(shè)置了unique的值為true,即這個外鍵是唯一的,即一對一關(guān)系。
client表如下:
生成client表的sql語言:
CREATE TABLE `client` ( `ID` int(4) NOT NULL AUTO_INCREMENT , `CLIENTNAME` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `PHONE` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `EMAIL` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `CLIENTADDRESSID` int(4) NULL DEFAULT NULL , PRIMARY KEY (`ID`), FOREIGN KEY (`CLIENTADDRESSID`) REFERENCES `address` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE, INDEX `CLIENTADDRESSID` (`CLIENTADDRESSID`) USING BTREE ) 注意:這里的CLIENTADDRESSID是外鍵,client表也要設(shè)置外鍵
address表如下:
CREATE TABLE `address` ( `ID` int(4) NOT NULL AUTO_INCREMENT , `PROVINCE` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `CITY` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `STREET` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `ZIPCODE` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`ID`) )
hibernate.cfg.xml配置文件:
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/onetoone</property><property name="connection.username">root</property><property name="connection.password">123456</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 顯示sql語句 --><property name="hibernate.show_sql">true </property> <property name="format_sql">true</property><!-- 讓輸出的sql語句格式化 --><mapping resource="com/hust/javabeans/Address.hbm.xml" /><mapping resource="com/hust/javabeans/Client.hbm.xml" /><mapping resource="com/hust/javabeans/Company.hbm.xml" /><mapping resource="com/hust/javabeans/Login.hbm.xml" /></session-factory></hibernate-configuration>
一對一主鍵雙向關(guān)聯(lián):
Company.java
package com.hust.javabeans; import java.io.Serializable; public class Company implements Serializable {/*** */private Integer id;private String companyname;private String linkman;private String telephone;private String email;private Login login; //關(guān)聯(lián)另外一個類,即保證Company對象中有Login對象的信息,體現(xiàn)一對一關(guān)聯(lián)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getCompanyname() {return companyname;}public void setCompanyname(String companyname) {this.companyname = companyname;}public String getLinkman() {return linkman;}public void setLinkman(String linkman) {this.linkman = linkman;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Login getLogin() {return login;}public void setLogin(Login login) {this.login = login;}} Login.java
package com.hust.javabeans; import java.io.Serializable; public class Login implements Serializable {/*** */private static final long serialVersionUID = 1L;private Integer id;private String loginname;private String loginpwd;private Company company; //關(guān)聯(lián)另外一個類,即保證Login對象中有Company對象的信息,體現(xiàn)一對一關(guān)聯(lián)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLoginname() {return loginname;}public void setLoginname(String loginname) {this.loginname = loginname;}public String getLoginpwd() {return loginpwd;}public void setLoginpwd(String loginpwd) {this.loginpwd = loginpwd;}public Company getCompany() {return company;}public void setCompany(Company company) {this.company = company;}} Company.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping ><class name="com.hust.javabeans.Company" table="company"><id column="ID" name="id" type="integer"><generator class="identity"></generator></id><property name="companyname" column="COMPANYNAME" type="string"></property><property name="linkman" column="LINKMAN" type="string"></property><property name="telephone" column="TELEPHONE" type="string"></property><property name="email" column="EMAIL" type="string"></property><!-- 映射Company與Login的一對一主鍵關(guān)聯(lián) --><one-to-one name="login" class="com.hust.javabeans.Login" cascade="all" lazy="false" fetch="join" outer-join="true"></one-to-one></class> </hibernate-mapping> Login.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping><class name="com.hust.javabeans.Login" table="login"><!-- 使用外鍵生成機制(foreign),引用表company的主鍵作為login表的主鍵值 ,定義了外鍵的生成策略,這樣可以在級聯(lián)插入時保持company的主鍵和login的外鍵(也是主鍵)相同。--><id name="id" column="ID" type="integer"><generator class="foreign"><param name="property">company</param></generator></id><property name="loginname" column="LOGINNAME" type="string"></property><property name="loginpwd" column="LOGINPWD" type="string"></property><!-- 映射Company與Login的一對一主鍵關(guān)聯(lián) --> <one-to-one name="company" class="com.hust.javabeans.Company" constrained="true"></one-to-one><!-- constrained="true"表示Login引用了company的主鍵作為外鍵 --></class> </hibernate-mapping>
一對一外鍵雙向關(guān)聯(lián):
Client.java
package com.hust.javabeans;import java.io.Serializable;public class Client implements Serializable {private Integer id;private String clientname;private String phone;private String email;private Address client_address; //關(guān)聯(lián)另一個類public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getClientname() {return clientname;}public void setClientname(String clientname) {this.clientname = clientname;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Address getClient_address() {return client_address;}public void setClient_address(Address client_address) {this.client_address = client_address;}} Address.java
package com.hust.javabeans; import java.io.Serializable; public class Address implements Serializable {private Integer id;private String province;private String city;private String street;private String zipcode;private Client address_client;//關(guān)聯(lián)另外一個類public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getZipcode() {return zipcode;}public void setZipcode(String zipcode) {this.zipcode = zipcode;}public Client getAddress_client() {return address_client; }public void setAddress_client(Client address_client) {this.address_client = address_client; }} Client.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping><class name="com.hust.javabeans.Client" table="client"><id name="id" column="ID" type="integer"><generator class="identity"></generator></id><property name="clientname" column="CLIENTNAME" type="string"></property><property name="phone" column="PHONE" type="string"></property><property name="email" column="EMAIL" type="string"></property><!-- 映射Client和Address的一對一外鍵關(guān)聯(lián),唯一多對一,實際上時一對一關(guān)系,這里的name是Client的屬性,column是client表的外鍵--><many-to-one name="client_address" class="com.hust.javabeans.Address" column="CLIENTADDRESSID" cascade="all" lazy="false" unique="true"></many-to-one></class> </hibernate-mapping>
<many-to-one unique="true"> 標(biāo)簽在這里表示一對一,many-to-one應(yīng)該寫在有外鍵的那個表對應(yīng)的映射文件中
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="com.hust.javabeans.Address" table="address"><id column="ID" name="id" type="integer"><generator class="identity"/></id><property name="province" column="PROVINCE" type="string"/><property name="city" column="CITY" type="string"/><property name="street" column="STREET" type="string"/><property name="zipcode" column="ZIPCODE" type="string"/><!-- 映射Client和Address的一對一外鍵關(guān)聯(lián),name是Address的屬性,property-ref是Client中的屬性<span style="font-family:Arial, Helvetica, sans-serif;">client_address--></span><one-to-one name="address_client" class="com.hust.javabeans.Client" property-ref="client_address"/> </class> </hibernate-mapping>
package com.hust.dao; import org.hibernate.Session; import org.hibernate.Transaction; import com.hust.javabeans.Client; import com.hust.javabeans.Company; import SessionFactory.HibernateSessionFactory;public class OneOneDao {//添加會員 的方法,只操作主控方public void addCompany(Company company){Session session=HibernateSessionFactory.getSession();Transaction ts=null;try{ts=session.beginTransaction();System.out.println("oneonedao的addCompany方法執(zhí)行,執(zhí)行的sql:");session.save(company);System.out.println("oneonedao的addCompany方法完成");ts.commit(); }catch(Exception ex){ts.rollback();System.out.println("[系統(tǒng)錯誤]oneonedao的addCompany方法中出錯");ex.printStackTrace(); }finally{HibernateSessionFactory.closeSession();} }//獲取會員信息public Company loadCompany(Integer id){Session session=HibernateSessionFactory.getSession();Transaction ts=null;Company company=null;try{ts=session.beginTransaction();System.out.println("oneonedao的loadCompany方法執(zhí)行,執(zhí)行的sql:");company=(Company)session.get(Company.class, id);System.out.println("oneonedao的loadCompany方法完成");ts.commit(); }catch(Exception ex){ts.rollback();System.out.println("[系統(tǒng)錯誤]早oneonedao的loadCompany方法中出錯");ex.printStackTrace(); }finally{HibernateSessionFactory.closeSession();}return company;}//添加客戶信息,<span style="font-family: Arial, Helvetica, sans-serif;">只操作主控方</span>public void addClient(Client client){Session session=HibernateSessionFactory.getSession();Transaction ts=null;try{ts=session.beginTransaction();System.out.println("oneonedao的addclient方法執(zhí)行,執(zhí)行的sql:");session.save(client); System.out.println("oneonedao的addclient方法完成");ts.commit(); }catch(Exception ex){ts.rollback();System.out.println("[系統(tǒng)錯誤]oneonedao的addClient方法中出錯");ex.printStackTrace(); }finally{HibernateSessionFactory.closeSession();} }//獲取客戶信息public Client loadClient(Integer id){Session session=HibernateSessionFactory.getSession();Transaction ts=null;Client client=null;try{ts=session.beginTransaction();System.out.println("oneonedao的loadclient方法執(zhí)行,執(zhí)行的sql:");client=(Client)session.get(Client.class, id);System.out.println("oneonedao的loadclient方法完成");ts.commit(); }catch(Exception ex){ts.rollback();System.out.println("[系統(tǒng)錯誤]oneonedao的loadclient方法中出錯");ex.printStackTrace(); }finally{HibernateSessionFactory.closeSession();}return client;} } TestBean.java
package com.hust.test;import com.hust.dao.OneOneDao; import com.hust.javabeans.Address; import com.hust.javabeans.Client; import com.hust.javabeans.Company; import com.hust.javabeans.Login;public class TestBean {OneOneDao oneonedao=new OneOneDao();//獲取會員信息public void addCompany(){Company company=new Company();Login login=new Login();login.setLoginname("tuke");login.setLoginpwd("123456");company.setCompanyname("呵呵噠的微笑");company.setLinkman("張珊");company.setTelephone("010-12345678");company.setEmail("beijing@163.com");//PO對象之間互相設(shè)置關(guān)聯(lián)關(guān)系login.setCompany(company);company.setLogin(login);System.out.println("testbean的addcompany方法執(zhí)行開始");//添加會員信息,保存到數(shù)據(jù)庫,company保存到數(shù)據(jù)庫,同時login也保存到數(shù)據(jù)庫,只操作主控方oneonedao.addCompany(company);System.out.println("testbean的addcompany方法執(zhí)行完成");}//獲取會員信息public Company loadCompany(Integer id){//從數(shù)據(jù)庫獲得company的同時也獲得了login表的記錄System.out.println("testbean的loadcompany方法執(zhí)行開始");return oneonedao.loadCompany(id);}//添加客戶信息public void addClient(){Client client=new Client();Address address=new Address();address.setProvince("湖北省");address.setCity("武漢市");address.setStreet("臨江大道");address.setZipcode("100083");client.setClientname("李想");client.setPhone("027-76866876");client.setEmail("lixiang@126.com");//PO對象之間互相設(shè)置關(guān)聯(lián)關(guān)系address.setAddress_client(client);client.setClient_address(address);System.out.println("testbean的addclient方法執(zhí)行開始");//添加客戶信息,保存到數(shù)據(jù)庫,client保存到數(shù)據(jù)庫,同時address也保存到數(shù)據(jù)庫,只操作主控方oneonedao.addClient(client);System.out.println("testbean的addclient方法執(zhí)行完成");}//獲得客戶信息public Client loadClient(Integer id){System.out.println("testbean的loadclient方法執(zhí)行開始");return oneonedao.loadClient(id);}} 結(jié)果顯示為:
控制臺打印的sql是:
testbean的addcompany方法執(zhí)行開始 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. oneonedao的addCompany方法執(zhí)行,執(zhí)行的sql: Hibernate: insert intocompany(COMPANYNAME, LINKMAN, TELEPHONE, EMAIL) values(?, ?, ?, ?) oneonedao的addCompany方法完成 Hibernate: insert intologin(LOGINNAME, LOGINPWD, ID) values(?, ?, ?) testbean的addcompany方法執(zhí)行完成 //主鍵關(guān)聯(lián)時,兩個insert語句不是連續(xù)完成的 testbean的addclient方法執(zhí)行開始 oneonedao的addclient方法執(zhí)行,執(zhí)行的sql: Hibernate: insert intoaddress(PROVINCE, CITY, STREET, ZIPCODE) values(?, ?, ?, ?) Hibernate: insert intoclient(CLIENTNAME, PHONE, EMAIL, CLIENTADDRESSID) values(?, ?, ?, ?) oneonedao的addclient方法完成 testbean的addclient方法執(zhí)行完成 //外鍵關(guān)聯(lián)時,連續(xù)執(zhí)行兩個insert語句 testbean的loadcompany方法執(zhí)行開始 oneonedao的loadCompany方法執(zhí)行,執(zhí)行的sql: Hibernate: selectcompany0_.ID as ID2_1_,company0_.COMPANYNAME as COMPANYN2_2_1_,company0_.LINKMAN as LINKMAN2_1_,company0_.TELEPHONE as TELEPHONE2_1_,company0_.EMAIL as EMAIL2_1_,login1_.ID as ID3_0_,login1_.LOGINNAME as LOGINNAME3_0_,login1_.LOGINPWD as LOGINPWD3_0_ fromcompany company0_ left outer joinlogin login1_ on company0_.ID=login1_.ID wherecompany0_.ID=? oneonedao的loadCompany方法完成 testbean的loadclient方法執(zhí)行開始 oneonedao的loadclient方法執(zhí)行,執(zhí)行的sql: Hibernate: selectclient0_.ID as ID1_0_,client0_.CLIENTNAME as CLIENTNAME1_0_,client0_.PHONE as PHONE1_0_,client0_.EMAIL as EMAIL1_0_,client0_.CLIENTADDRESSID as CLIENTAD5_1_0_ fromclient client0_ whereclient0_.ID=? Hibernate: selectaddress0_.ID as ID0_1_,address0_.PROVINCE as PROVINCE0_1_,address0_.CITY as CITY0_1_,address0_.STREET as STREET0_1_,address0_.ZIPCODE as ZIPCODE0_1_,client1_.ID as ID1_0_,client1_.CLIENTNAME as CLIENTNAME1_0_,client1_.PHONE as PHONE1_0_,client1_.EMAIL as EMAIL1_0_,client1_.CLIENTADDRESSID as CLIENTAD5_1_0_ fromaddress address0_ left outer joinclient client1_ on address0_.ID=client1_.CLIENTADDRESSID whereaddress0_.ID=? Hibernate: selectclient0_.ID as ID1_0_,client0_.CLIENTNAME as CLIENTNAME1_0_,client0_.PHONE as PHONE1_0_,client0_.EMAIL as EMAIL1_0_,client0_.CLIENTADDRESSID as CLIENTAD5_1_0_ fromclient client0_ whereclient0_.CLIENTADDRESSID=? oneonedao的loadclient方法完成
總結(jié)
以上是生活随笔為你收集整理的hibernate的一对一主键双向映射关系和外键双向映射关系(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: myeclipse自动生成hiberna
- 下一篇: hibernate一对一外键单向关联