hibernate和jpa註解關聯總結

用hibernate和jpa annotation 大概一年多了,今天閒來無事,對他們關聯關係元數據寫法做一個總結。 
1.一對一主鍵關聯 
這個在實際項目中用的比較少,大部分是通過用外鍵做關聯的,這裏用用戶和手機號舉個例子,用戶和手機號是一對一的關係,代碼如下: 
User實體 
Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Users implements Serializable{  
  6.   
  7.       private static final long serialVersionUID = 1381652232198529039L;  
  8.     private int id;  
  9.     private String username;  
  10.     private String password;  
  11.     private CellphoneNumber phoneNumber;  
  12.     public CellphoneNumber getPhoneNumber() {  
  13.         return phoneNumber;  
  14.     }  
  15.     public void setPhoneNumber(CellphoneNumber phoneNumber) {  
  16.         this.phoneNumber = phoneNumber;  
  17.     }  
  18.     public int getId() {  
  19.         return id;  
  20.     }  
  21.     public void setId(int id) {  
  22.         this.id = id;  
  23.     }  
  24.     public String getUsername() {  
  25.         return username;  
  26.     }  
  27.     public void setUsername(String username) {  
  28.         this.username = username;  
  29.     }  
  30.     public String getPassword() {  
  31.         return password;  
  32.     }  
  33.     public void setPassword(String password) {  
  34.         this.password = password;  
  35.     }  
  36.   
  37.       
  38. }  


手機號實體 
Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class CellphoneNumber implements Serializable {  
  6.       
  7.     private static final long serialVersionUID = -1029364968566042141L;  
  8.       
  9.     private Integer cellPhoneId;  
  10.     private String number;  
  11.     private String attribution;//手機歸屬地  
  12.     private String cellphonoeType;//移動或者聯通  
  13.     private Users user ;  
  14.     public Users getUser() {  
  15.         return user;  
  16.     }  
  17.     public void setUser(Users user) {  
  18.         this.user = user;  
  19.     }  
  20.     public Integer getCellPhoneId() {  
  21.         return cellPhoneId;  
  22.     }  
  23.     public void setCellPhoneId(Integer cellPhoneId) {  
  24.         this.cellPhoneId = cellPhoneId;  
  25.     }  
  26.     public String getNumber() {  
  27.         return number;  
  28.     }  
  29.     public void setNumber(String number) {  
  30.         this.number = number;  
  31.     }  
  32.     public String getAttribution() {  
  33.         return attribution;  
  34.     }  
  35.     public void setAttribution(String attribution) {  
  36.         this.attribution = attribution;  
  37.     }  
  38.     public String getCellphonoeType() {  
  39.         return cellphonoeType;  
  40.     }  
  41.     public void setCellphonoeType(String cellphonoeType) {  
  42.         this.cellphonoeType = cellphonoeType;  
  43.     }  
  44.       
  45.     @Override  
  46.     public boolean equals(Object anotherObject){  
  47.         if(anotherObject == null || anotherObject.getClass() != this.getClass()){  
  48.             return false;  
  49.         }  
  50.         if(this == anotherObject){  
  51.             return true;  
  52.         }  
  53.           
  54.         CellphoneNumber another = (CellphoneNumber) anotherObject;  
  55.         if(another.cellPhoneId.equals(this.cellPhoneId)){  
  56.             return true  ;  
  57.         }  
  58.           
  59.         return false;  
  60.     }  
  61.       
  62.     public int hashCode(){  
  63.           
  64.         return cellPhoneId.hashCode();  
  65.     }  
  66.       
  67.       
  68. }  

users映射文件
Xml代碼  收藏代碼
  1.    <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping >  
  7.   
  8.         <class name="com.own.model.Users"  table="users"  dynamic-update="true"  dynamic-insert="true"     >  
  9.             
  10.            <id name="id"  column="id" >  
  11.               <generator class="native"></generator>  
  12.            </id>  
  13.              
  14.             <property name="username"  column="username"   ></property>    
  15.             <property name="password"  column="password" type="string"  ></property>    
  16.               
  17.             <!-- 這裏是一對一映射 級聯爲所有 -->  
  18.             <one-to-one name="phoneNumber" class="com.own.model.CellphoneNumber" cascade="all"  >  
  19.               
  20.             </one-to-one>      
  21.               
  22.         </class>  
  23. </hibernate-mapping>  

cellPhone映射文件
Xml代碼  收藏代碼
  1.    <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping >  
  7.   
  8.         <class name="com.own.model.CellphoneNumber"  table="cellphone"  dynamic-update="true"  dynamic-insert="true"   >  
  9.            <!-- 這裏設置外鍵關聯 -->  
  10.            <id name="cellPhoneId"  column="id" >  
  11.               <generator class="foreign">  
  12.                   <!-- 這裏設置用引用user實體的主鍵  -->  
  13.                 <param name="property">user</param>  
  14.               </generator>  
  15.            </id>  
  16.             <property name="number"  column="cellphoneNumber" ></property>    
  17.             <property name="attribution"  column="attribution"   ></property>    
  18.             <property name="cellphonoeType"  column="numberType"   ></property>    
  19.             <!-- 加上外鍵約束  ,使Cellphone的主鍵引用user錶行的主鍵 -->  
  20.             <one-to-one name="user" constrained="true"  class="com.own.model.Users"  ></one-to-one>  
  21.         </class>  
  22. </hibernate-mapping>  

在調用時,要設置關聯關係
Java代碼  收藏代碼
  1. Users u = new Users();    
  2.     u.setPassword("admin@1973");  
  3.     u.setUsername("floatSnow");  
  4.     CellphoneNumber cellphone = new CellphoneNumber();  
  5.     cellphone.setAttribution("北京");  
  6.     cellphone.setCellphonoeType("中國移動");  
  7.     cellphone.setNumber("13476534589");  
  8.     //設置雙向關聯關係  
  9.     u.setPhoneNumber(cellphone);  
  10.     cellphone.setUser(u);  


jpa中使用@PrimaryKeyJoinColumn  

Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3.   
  4. import java.io.Serializable;  
  5.   
  6. import javax.persistence.CascadeType;  
  7. import javax.persistence.Column;  
  8. import javax.persistence.Entity;  
  9. import javax.persistence.GeneratedValue;  
  10. import javax.persistence.Id;  
  11. import javax.persistence.OneToOne;  
  12. import javax.persistence.PrimaryKeyJoinColumn;  
  13. import javax.persistence.Table;  
  14. @Entity  
  15. @org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)  
  16. @Table(name="users")  
  17. public class Users implements Serializable{  
  18.     private static final long serialVersionUID = 1381652232198529039L;  
  19.     private int id;  
  20.     private String username;  
  21.     private String password;  
  22.     private CellphoneNumber cellphone;  
  23.       
  24.     @OneToOne(cascade={CascadeType.ALL})  
  25.     @PrimaryKeyJoinColumn  
  26.     public CellphoneNumber getCellphone() {  
  27.         return cellphone;  
  28.     }  
  29.     public void setCellphone(CellphoneNumber cellphone) {  
  30.         this.cellphone = cellphone;  
  31.     }  
  32.     @Id  
  33.     @GeneratedValue  
  34.     @Column(name="id")  
  35.     public int getId() {  
  36.         return id;  
  37.     }  
  38.     public void setId(int id) {  
  39.         this.id = id;  
  40.     }  
  41.       
  42.     @Column(name="username")  
  43.     public String getUsername() {  
  44.         return username;  
  45.     }  
  46.       
  47.     public void setUsername(String username) {  
  48.         this.username = username;  
  49.     }  
  50.       
  51.     @Column(name="password")  
  52.     public String getPassword() {  
  53.         return password;  
  54.     }  
  55.       
  56.     public void setPassword(String password) {  
  57.         this.password = password;  
  58.     }  
  59.   
  60.       
  61. }  


2.一對一外鍵關聯 
hibernate xml文件映射,在這裏使用manyToOne而不是我們想像的oneToOne,還有在  user表中加一個外鍵,引用另一個表的主鍵,這裏設置雙向關係,在項目中根據情況而定是否設置雙向關係 
映射文件 
Xml代碼  收藏代碼
  1.   <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping >  
  7.         <class name="com.own.model.Users"  table="users"  dynamic-update="true"  dynamic-insert="true" >  
  8.            <id name="id"  column="id" >  
  9.               <generator class="native"></generator>  
  10.            </id>  
  11.             <property name="username"  column="username"   ></property>    
  12.             <property name="password"  column="password" type="string"  ></property>   
  13.             <!-- 加上唯一約束,使這個關係成爲真正的一對一 -->   
  14.             <many-to-one name="phoneNumber" cascade="all" class="com.own.model.CellphoneNumber"  column="cell_id"    
  15.               unique="true"  >  
  16.             </many-to-one>  
  17.         </class>  
  18. </hibernate-mapping>  
  19.   
  20.    


jpa 映射使用oneToone,@joinColumn有兩個屬性 name 和 referencedColumnName 
,name是表示表中外鍵的列名,referencedColumnName表示外鍵引用的表的列名。 
user實體
Java代碼  收藏代碼
  1.    @OneToOne(cascade={CascadeType.ALL})  
  2.    @JoinColumn(name="cell_id",referencedColumnName="id")  
  3. public CellphoneNumber getCellphone() {  
  4.     return cellphone;  
  5. }  

手機實體類 
 
Java代碼  收藏代碼
  1.    
  2.  @OneToOne(mappedBy="cellphone")  
  3. ublic Users getU() {  
  4. return u;  

3.一對一可選關聯 
有的時候我們的外鍵是可選的,也就是說user表的外鍵是可以爲空的,這個時候我們可以把這中可選的關聯映射到一張表,加一張中間表,表示實體的對應關係 
Users實體映射文件
 
Xml代碼  收藏代碼
  1.   <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping >  
  7.         <class name="com.own.model.Users"  table="users"  dynamic-update="true"  dynamic-insert="true" >  
  8.            <id name="id"  column="id" >  
  9.               <generator class="native"></generator>  
  10.            </id>  
  11.             <property name="username"  column="username"   ></property>    
  12.             <property name="password"  column="password" type="string"  ></property>   
  13.             <!-- 加上唯一約束,使這個關係成爲真正的一對一 -->   
  14.             <!-- optional 告訴hibernate這個關係是可選的 ,當這個屬性爲空時,可以不插入關聯表 -->  
  15.             <join table="user_cellphoneNumber"      >  
  16.               <key column="user_id"    unique="true"  />  
  17.                <many-to-one name="phoneNumber"  cascade="save-update"      class="com.own.model.CellphoneNumber"   column="cell_id"    
  18.               unique="true"     >  
  19.             </many-to-one>  
  20.             </join>  
  21.         </class>     
  22. </hibernate-mapping>  

jpa註解把屬性映射到兩張表,通過使用@SecondaryTable,使屬性映射到一張中間表。 
Java代碼  收藏代碼
  1.    package com.own.model;  
  2.   
  3.   
  4. import java.io.Serializable;  
  5.   
  6. import javax.persistence.CascadeType;  
  7. import javax.persistence.Column;  
  8. import javax.persistence.Entity;  
  9. import javax.persistence.GeneratedValue;  
  10. import javax.persistence.Id;  
  11. import javax.persistence.JoinColumn;  
  12. import javax.persistence.OneToOne;  
  13. import javax.persistence.PrimaryKeyJoinColumn;  
  14. import javax.persistence.SecondaryTable;  
  15. import javax.persistence.Table;  
  16.   
  17. import org.hibernate.transaction.JOnASTransactionManagerLookup;  
  18. @Entity  
  19. @org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)  
  20. @Table(name="users")  
  21. @SecondaryTable(name="user_cellphoneNumber",pkJoinColumns={@PrimaryKeyJoinColumn(name="user_id",referencedColumnName="id")})  
  22. public class Users implements Serializable{  
  23.     private static final long serialVersionUID = 1381652232198529039L;  
  24.     private int id;  
  25.     private String username;  
  26.     private String password;  
  27.     private CellphoneNumber cellphone;  
  28.     @OneToOne(cascade={CascadeType.ALL})  
  29.     @JoinColumn(table="user_cellphoneNumber",name="cell_id",referencedColumnName="id")  
  30.     public CellphoneNumber getCellphone() {  
  31.         return cellphone;  
  32.     }  
  33.     public void setCellphone(CellphoneNumber cellphone) {  
  34.         this.cellphone = cellphone;  
  35.     }  
  36.     @Id  
  37.     @GeneratedValue  
  38.     @Column(name="id")  
  39.     public int getId() {  
  40.         return id;  
  41.     }  
  42.     public void setId(int id) {  
  43.         this.id = id;  
  44.     }  
  45.       
  46.     @Column(name="username")  
  47.     public String getUsername() {  
  48.         return username;  
  49.     }  
  50.       
  51.     public void setUsername(String username) {  
  52.         this.username = username;  
  53.     }  
  54.       
  55.     @Column(name="password")  
  56.     public String getPassword() {  
  57.         return password;  
  58.     }  
  59.       
  60.     public void setPassword(String password) {  
  61.         this.password = password;  
  62.     }  
  63.   
  64.       
  65. }       

4.一對多關聯 
一對多關聯通過oneToMany和ManyToMany映射,這裏的多段在java裏用一個集合set來表示,這個用商品category和貨物Goods來舉例子。 
one端實體Category 映射xml 

Xml代碼  收藏代碼
  1.  <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping >  
  7.         <class name="com.own.model.Category"  table="category"  dynamic-insert="true" dynamic-update="false"      >  
  8.            <id name="category_id"  column="id" >  
  9.               <generator class="native"></generator>  
  10.            </id>  
  11.             <property name="categoryName"  column="category_name" type="string"  ></property>   
  12.                
  13.             <set name="goodsSet" inverse="true"  cascade="save-update"   >    <!-- 用key column 的名字表示關聯表的外鍵的名稱  -->  
  14.                <key column="category_id"    />   
  15.                <one-to-many  class="com.own.model.Goods"   />   
  16.               </set>   
  17.         </class>  
  18. </hibernate-mapping>  

many端的映射文件 
Java代碼  收藏代碼
  1.     <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping   >  
  7.         <class name="com.own.model.Goods"  table="goods"  dynamic-insert="true" dynamic-update="false"      >  
  8.            <id name="id"  column="goods_id" >  
  9.               <generator class="native"></generator>  
  10.            </id>  
  11.             <property name="price"  column="goods_price" type="double"  ></property>    
  12.             <property name="goodsName"  column="goods_name" type="string"  ></property>    
  13.             <property name="goodsDescription"  column="goods_description" type="string"  ></property>    
  14.             <many-to-one name="category"      fetch="join"    class="com.own.model.Category"  column="category_id"      >  
  15.             </many-to-one>  
  16.         </class>  
  17.    
  18. </hibernate-mapping>  

jpa元數據註解 
Category實體
 
Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. import javax.persistence.CascadeType;  
  8. import javax.persistence.Column;  
  9. import javax.persistence.Entity;  
  10. import javax.persistence.GeneratedValue;  
  11. import javax.persistence.Id;  
  12. import javax.persistence.OneToMany;  
  13. import javax.persistence.Table;  
  14.   
  15. @Entity  
  16. @org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)  
  17. @Table(name="category")  
  18. public class Category implements Serializable {  
  19.     private static final long serialVersionUID = 1L;  
  20.     private Integer category_id;  
  21.     private String categoryName;  
  22.     private Set<Goods> goodsSet = new HashSet<Goods>();   
  23.       
  24.     @OneToMany(mappedBy="category",cascade={CascadeType.ALL})  
  25.     public Set<Goods> getGoodsSet() {  
  26.         return goodsSet;  
  27.     }  
  28.     public void setGoodsSet(Set<Goods> goodsSet) {  
  29.         this.goodsSet = goodsSet;  
  30.     }  
  31.     @Id  
  32.     @GeneratedValue  
  33.     @Column(name="id")  
  34.     public Integer getCategory_id() {  
  35.         return category_id;  
  36.     }  
  37.     public void setCategory_id(Integer categoryId) {  
  38.         category_id = categoryId;  
  39.     }  
  40.       
  41.     @Column(name="category_name")  
  42.     public String getCategoryName() {  
  43.         return categoryName;  
  44.     }  
  45.     public void setCategoryName(String categoryName) {  
  46.         this.categoryName = categoryName;  
  47.     }  
  48.   
  49.       
  50.       
  51. }  


Goods實體
Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3.   
  4. import java.io.Serializable;  
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.GenerationType;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.JoinColumn;  
  11. import javax.persistence.ManyToOne;  
  12. import javax.persistence.Table;  
  13.   
  14. @Entity  
  15. @org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)  
  16. @Table(name="goods")  
  17. public class Goods implements Serializable {  
  18.     private static final long serialVersionUID = 1L;  
  19.     private Integer id;  
  20.     private  String goodsName;  
  21.     private Double price;  
  22.     private String goodsDescription;      
  23.     private Category category;  
  24.     @ManyToOne  
  25.     @JoinColumn(name="category_id",referencedColumnName="id")  
  26.     public Category getCategory() {  
  27.         return category;  
  28.     }  
  29.   
  30.     public void setCategory(Category category) {  
  31.         this.category = category;  
  32.     }  
  33.   
  34.     public Goods(){}  
  35.       
  36.     @Id  
  37.     @GeneratedValue(strategy=GenerationType.AUTO)  
  38.     @Column(name="goods_id")  
  39.     public Integer getId() {  
  40.         return id;  
  41.     }  
  42.       
  43.     public void setId(Integer id) {  
  44.         this.id = id;  
  45.     }  
  46.       
  47.     @Column(name="goods_name",length=40,nullable=false)  
  48.     public String getGoodsName() {  
  49.         return goodsName;  
  50.     }  
  51.     public void setGoodsName(String goodsName) {  
  52.         this.goodsName = goodsName;  
  53.     }  
  54.       
  55.     @Column(name="goods_price")  
  56.     public Double getPrice() {  
  57.         return price;  
  58.     }  
  59.     public void setPrice(Double price) {  
  60.         this.price = price;  
  61.     }  
  62.       
  63.     @Column(name="goods_description")  
  64.     public String getGoodsDescription() {  
  65.         return goodsDescription;  
  66.     }  
  67.     public void setGoodsDescription(String goodsDescription) {  
  68.         this.goodsDescription = goodsDescription;  
  69.     }  
  70.   
  71.       
  72.     @Override  
  73.     public boolean equals(Object o) {  
  74.           
  75.         if(o == null || o.getClass() != this.getClass()){  
  76.             return false;  
  77.         }  
  78.           
  79.         if(o == this){  
  80.             return true;  
  81.         }  
  82.           
  83.         Goods goods = (Goods) o;  
  84.           
  85.         if(id == null ? goods.id == null : this.id.equals(goods.id)){  
  86.             return true;  
  87.         }  
  88.           
  89.           
  90.         return false;  
  91.     }  
  92.       
  93.     /*@Override 
  94.     public int hashCode() { 
  95.         //return this.id.hashCode(); 
  96.         return  
  97.     }*/  
  98.       
  99. }  


5.多對多關聯 
多對多關聯用manyToMany來映射,這裏用學生和選的課程,它們是多對多的關聯,多對對 
關聯通常需要一張中間表,這個表就兩字段,學生id和課程id(這裏中間表就兩個字段) 
在java中用兩set集合來表示 
student 映射文件
 
Xml代碼  收藏代碼
  1.   <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping >  
  7.         <class name="com.own.model.Student"  table="student"  dynamic-update="true"  dynamic-insert="true" >  
  8.            <id name="studentId"  column="id" >  
  9.               <generator class="native"></generator>  
  10.            </id>  
  11.             <property name="studentName"  column="student_name"   ></property>    
  12.             <property name="studentNum"  column="student_no" type="string"  ></property>   
  13.             <set name="cosrseSet"    table="student_course"  >  
  14.            <!--  引用當前實體主鍵的外鍵名稱   -->     
  15.           <key  column="student_id"   />  
  16.               <many-to-many column="course_id"  class="com.own.model.Course"   ></many-to-many>  
  17.             </set>  
  18.         </class>  
  19. </hibernate-mapping>  

course映射文件
Xml代碼  收藏代碼
  1.   <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping   >  
  6.         <class name="com.own.model.Course"  table="course"  dynamic-update="true"     dynamic-insert="true" >  
  7.            <id name="courseId"  column="id" >  
  8.               <generator class="native"></generator>  
  9.            </id>  
  10.             <property name="courseName"  column="course_name"   ></property>    
  11.             <property name="courseNum"   column="course_no"  ></property>   
  12.               
  13.           <set name="studentSet"  inverse="true"  cascade="all"    table="student_course"    >  
  14.               <key  column="course_id"   />  
  15.               <many-to-many column="student_id"  class="com.own.model.Student"   ></many-to-many>  
  16.            </set>  
  17.         </class>  
  18. </hibernate-mapping>  

jpa元數據 
Student實體
Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6. import javax.persistence.Column;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.JoinColumn;  
  11. import javax.persistence.JoinTable;  
  12. import javax.persistence.ManyToMany;  
  13. import javax.persistence.Table;  
  14. @Entity  
  15. @Table(name="student")  
  16. public class Student implements Serializable {  
  17.       
  18.     private static final long serialVersionUID = 1L;  
  19.     private Integer studentId;  
  20.     private String studentName;  
  21.     private String studentNum;  
  22.     private Set<Course> cosrseSet = new HashSet<Course>();  
  23.     @ManyToMany  
  24.     @JoinTable(name="student_course",joinColumns={@JoinColumn(name="student_id")},  
  25.                inverseJoinColumns={@JoinColumn(name="course_id")})  
  26.     public Set<Course> getCosrseSet() {  
  27.         return cosrseSet;  
  28.     }  
  29.     public void setCosrseSet(Set<Course> cosrseSet) {  
  30.         this.cosrseSet = cosrseSet;  
  31.     }  
  32.       
  33.     @Id  
  34.     @GeneratedValue  
  35.     @Column(name="id")  
  36.     public Integer getStudentId() {  
  37.         return studentId;  
  38.     }  
  39.     public void setStudentId(Integer studentId) {  
  40.         this.studentId = studentId;  
  41.     }  
  42.       
  43.     @Column(name="student_name")  
  44.     public String getStudentName() {  
  45.         return studentName;  
  46.     }  
  47.     public void setStudentName(String studentName) {  
  48.         this.studentName = studentName;  
  49.     }  
  50.       
  51.     @Column(name="student_no")  
  52.     public String getStudentNum() {  
  53.         return studentNum;  
  54.     }  
  55.     public void setStudentNum(String studentNum) {  
  56.         this.studentNum = studentNum;  
  57.     }  
  58.   
  59. }  

Course實體
Java代碼  收藏代碼
  1.   package com.own.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import java.util.HashSet;  
  6. import java.util.Set;  
  7.   
  8. import javax.persistence.Column;  
  9. import javax.persistence.Entity;  
  10. import javax.persistence.GeneratedValue;  
  11. import javax.persistence.Id;  
  12. import javax.persistence.ManyToMany;  
  13. import javax.persistence.Table;  
  14. @Entity  
  15. @Table(name="course")  
  16. public class Course implements Serializable {  
  17.     private static final long serialVersionUID = 1L;  
  18.     private Integer courseId;  
  19.     private String courseNum;  
  20.     private String courseName;  
  21.     private Set<Student> studentSet = new HashSet<Student>();  
  22.       
  23.     @ManyToMany(mappedBy="cosrseSet")  
  24.     public Set<Student> getStudentSet() {  
  25.         return studentSet;  
  26.     }  
  27.     public void setStudentSet(Set<Student> studentSet) {  
  28.         this.studentSet = studentSet;  
  29.     }  
  30.     @Id  
  31.     @GeneratedValue  
  32.     @Column(name="id")  
  33.     public Integer getCourseId() {  
  34.         return courseId;  
  35.     }  
  36.     public void setCourseId(Integer courseId) {  
  37.         this.courseId = courseId;  
  38.     }  
  39.       
  40.     @Column(name="course_no")  
  41.     public String getCourseNum() {  
  42.         return courseNum;  
  43.     }  
  44.     public void setCourseNum(String courseNum) {  
  45.         this.courseNum = courseNum;  
  46.     }  
  47.       
  48.     @Column(name="course_name")  
  49.     public String getCourseName() {  
  50.         return courseName;  
  51.     }  
  52.     public void setCourseName(String courseName) {  
  53.         this.courseName = courseName;  
  54.     }  
  55.   
  56.   /* @Override 
  57.    public boolean equals(Object o) { 
  58.      if(o == null || o.getClass() != Course.class){ 
  59.          return false; 
  60.      } 
  61.           
  62.      if(o == this){ 
  63.          return true;  
  64.      } 
  65.         
  66.      Course another = (Course)o; 
  67.      if(courseId == null ? another.courseId == null : courseId.equals(another.courseId)){ 
  68.          return true; 
  69.      } 
  70.       
  71.      return  false; 
  72.      
  73.   } 
  74.  
  75.   @Override 
  76.    public int hashCode() { 
  77.     return super.hashCode(); 
  78.      // return 1; 
  79.   }*/  
  80.      
  81.       
  82. }  


在多對對關聯的情況下,用的是set集合,實體要實現hashcode和equals,不然在更新關聯表的時候會更新不了,比如學生不在選擇這門課程,從set集合中remove掉這個課程,然後更新這個學生實體,代碼如下,在不實現hashcode和equals更新不會成功,只有實現了纔可以,hibernate返回了自己寫的集合,PersistenceSet而不是HashSet,這也是爲什麼我們在實體中寫set接口,不能寫HashSet ... = new HashSet,要用 Set ... = new HashSet 。
Java代碼  收藏代碼
  1. tc = session.beginTransaction();  
  2.    Student s1 = (Student) session.get(Student.class,9) ;  
  3.          Course c = new Course();  
  4.         s1.getCosrseSet().remove(c);  
  5.         session.update(s1);//更新學生的選課  
  6. tc.commit();  


最後講解一下cascade和inverse這兩個屬性,剛用hibernate的時候也比較不理解,首先這兩個屬性沒有任何關係,cascade表示級聯,就是被關聯的一段,比如cascade='save-update',級聯保存和更新,在設置了cascade的端,保存這個對象,會一併保存關聯的一端,省去了我們寫保存關聯端的代碼,inverse表示有誰來維護關聯,在一段設置inverse=true,則有關聯對來維護關聯關係,比如上面的例子,在course端設置了inverse=true,則有student來維護中間表,只有當插入student的時候,才向中間表插入數據,如果都設置inverse=true則會插入重複數據,如果不設置,則會出錯,在jpa元數據註解中 用mappedBy來表示有那方來維護關聯關係
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章