hibernate的一對一主鍵雙向映射關係和外鍵雙向映射關係(一)
主鍵關聯的重點是關聯的兩個表共用一個主索引值。本例中採用,一個單位在網上的一個系統中註冊會員。
1,會員資料儲存在會員表company中,每個會員的登入帳號儲存在表login中;
2,一個會員只有一個登入帳號,一個登入帳號只屬於一個會員,兩表是一對一的對應關係;
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語句如下:
CREATE TABLE `login` ( `ID` int(4) NOT NULL , `LOGINNAME` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `LOGINPWD` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`ID`) )
外部索引鍵關聯的重點是:兩個表各自有不同的主鍵,但是其中一個表有一個外鍵引用另一個表的主鍵。即非主鍵是別人的主鍵就是該表的外鍵。
這個例子中:
1,客戶(Client)和客戶地址(Address)是外部索引鍵關聯的一對一關聯性,分別對應client表換個address表。
2,Client類在對應檔中的client_address為外鍵引用Address類的對應表中的主鍵,咋一看書多對一關聯性,但是在Client類對應的對應檔設定多對一對應的屬性client_address時,設定了unique的值為true,即這個外鍵是唯一的,即一對一關聯性。
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表也要設定外鍵
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設定檔:
org.hibernate.dialect.MySQLInnoDBDialectjdbc:mysql://localhost:3306/onetooneroot123456com.mysql.jdbc.Driver true true
一對一主鍵雙向關聯:
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; //關聯另外一個類,即保證Company對象中有Login對象的資訊,體現一對一關聯 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; //關聯另外一個類,即保證Login對象中有Company對象的資訊,體現一對一關聯 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
Login.hbm.xml
company
一對一外鍵雙向關聯:
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; //關聯另一個類 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;//關聯另外一個類 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
標籤在這裡表示一對一,many-to-one應該寫在有外鍵的那個表對應的對應檔中
Address.hbm.xml
訪問資料庫檔案OneOneDao.java
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方法執行,執行的sql:);session.save(company);System.out.println(oneonedao的addCompany方法完成);ts.commit();}catch(Exception ex){ts.rollback();System.out.println([系統錯誤]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方法執行,執行的sql:);company=(Company)session.get(Company.class, id);System.out.println(oneonedao的loadCompany方法完成);ts.commit();}catch(Exception ex){ts.rollback();System.out.println([系統錯誤]早oneonedao的loadCompany方法中出錯);ex.printStackTrace();}finally{HibernateSessionFactory.closeSession();}return company;} //添加客戶資訊,只操作主控方public void addClient(Client client){Session session=HibernateSessionFactory.getSession();Transaction ts=null;try{ts=session.beginTransaction();System.out.println(oneonedao的addclient方法執行,執行的sql:);session.save(client);System.out.println(oneonedao的addclient方法完成);ts.commit();}catch(Exception ex){ts.rollback();System.out.println([系統錯誤]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方法執行,執行的sql:);client=(Client)session.get(Client.class, id);System.out.println(oneonedao的loadclient方法完成);ts.commit();}catch(Exception ex){ts.rollback();System.out.println([系統錯誤]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([email protected]); //PO對象之間互相設定關聯關係 login.setCompany(company); company.setLogin(login); System.out.println(testbean的addcompany方法執行開始); //添加會員資訊,儲存到資料庫,company儲存到資料庫,同時login也儲存到資料庫,只操作主控方 oneonedao.addCompany(company); System.out.println(testbean的addcompany方法執行完成); } //擷取會員資訊 public Company loadCompany(Integer id){ //從資料庫獲得company的同時也獲得了login表的記錄 System.out.println(testbean的loadcompany方法執行開始); 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([email protected]); //PO對象之間互相設定關聯關係 address.setAddress_client(client); client.setClient_address(address); System.out.println(testbean的addclient方法執行開始); //添加客戶資訊,儲存到資料庫,client儲存到資料庫,同時address也儲存到資料庫,只操作主控方 oneonedao.addClient(client); System.out.println(testbean的addclient方法執行完成); } //獲得客戶資訊 public Client loadClient(Integer id){ System.out.println(testbean的loadclient方法執行開始); return oneonedao.loadClient(id); } }結果顯示為:
控制台列印的sql是:
testbean的addcompany方法執行開始log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.oneonedao的addCompany方法執行,執行的sql:Hibernate: insert into company (COMPANYNAME, LINKMAN, TELEPHONE, EMAIL) values (?, ?, ?, ?)oneonedao的addCompany方法完成Hibernate: insert into login (LOGINNAME, LOGINPWD, ID) values (?, ?, ?)testbean的addcompany方法執行完成 //主鍵關聯時,兩個insert語句不是連續完成的testbean的addclient方法執行開始oneonedao的addclient方法執行,執行的sql:Hibernate: insert into address (PROVINCE, CITY, STREET, ZIPCODE) values (?, ?, ?, ?)Hibernate: insert into client (CLIENTNAME, PHONE, EMAIL, CLIENTADDRESSID) values (?, ?, ?, ?)oneonedao的addclient方法完成testbean的addclient方法執行完成 //外部索引鍵關聯時,連續執行兩個insert語句testbean的loadcompany方法執行開始oneonedao的loadCompany方法執行,執行的sql:Hibernate: select company0_.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_ from company company0_ left outer join login login1_ on company0_.ID=login1_.ID where company0_.ID=?oneonedao的loadCompany方法完成testbean的loadclient方法執行開始oneonedao的loadclient方法執行,執行的sql:Hibernate: select client0_.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_ from client client0_ where client0_.ID=?Hibernate: select address0_.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_ from address address0_ left outer join client client1_ on address0_.ID=client1_.CLIENTADDRESSID where address0_.ID=?Hibernate: select client0_.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_ from client client0_ where client0_.CLIENTADDRESSID=?oneonedao的loadclient方法完成