hibernate的一對一主鍵雙向映射關係和外鍵雙向映射關係(一)

來源:互聯網
上載者:User

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方法完成


 

 






 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.