隨筆-126  評論-247  文章-5  trackbacks-0

          假設,一個農場產出多種植物,具體的某一植物產于某一農場。

           1 package net.yeah.fancydeepin.po;
           2 
           3 import java.io.Serializable;
           4 import java.util.Set;
           5 import javax.persistence.Column;
           6 import javax.persistence.Entity;
           7 import javax.persistence.GeneratedValue;
           8 import javax.persistence.Id;
           9 import javax.persistence.OneToMany;
          10 /**
          11  * -----------------------------------------
          12  * @描述  農場
          13  * @作者  fancy
          14  * @郵箱  fancydeepin@yeah.net
          15  * @日期  2012-10-21 <p>
          16  * -----------------------------------------
          17  */
          18 @Entity
          19 public class Farm implements Serializable{
          20 
          21     private static final long serialVersionUID = 1L;
          22     
          23     private Integer id;
          24     private String  name;
          25     private Set<Plant> plantSet;
          26     
          27     @Id
          28     @GeneratedValue
          29     public Integer getId() {
          30         return id;
          31     }
          32     @Column(length = 18, nullable = false)
          33     public String getName() {
          34         return name;
          35     }
          36     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
          37     public Set<Plant> getPlantSet() {
          38         return plantSet;
          39     }
          40     public void setId(Integer id) {
          41         this.id = id;
          42     }
          43     public void setName(String name) {
          44         this.name = name;
          45     }
          46     public void setPlantSet(Set<Plant> plantSet) {
          47         this.plantSet = plantSet;
          48     }
          49 }


           1 package net.yeah.fancydeepin.po;
           2 
           3 import java.io.Serializable;
           4 import javax.persistence.Column;
           5 import javax.persistence.Entity;
           6 import javax.persistence.GeneratedValue;
           7 import javax.persistence.Id;
           8 /**
           9  * -----------------------------------------
          10  * @描述  植物
          11  * @作者  fancy
          12  * @郵箱  fancydeepin@yeah.net
          13  * @日期  2012-10-21 <p>
          14  * -----------------------------------------
          15  */
          16 @Entity
          17 public class Plant implements Serializable{
          18 
          19     private static final long serialVersionUID = 1L;
          20     
          21     private Integer id;
          22     private String  name;
          23     
          24     @Id
          25     @GeneratedValue
          26     public Integer getId() {
          27         return id;
          28     }
          29     @Column(length = 18, nullable = false)
          30     public String getName() {
          31         return name;
          32     }
          33     public void setId(Integer id) {
          34         this.id = id;
          35     }
          36     public void setName(String name) {
          37         this.name = name;
          38     }
          39 
          40 }

          Junit 測試 :

          1 @Test
          2     public void createTable(){
          3         
          4         new SchemaExport(new AnnotationConfiguration().configure()).create(truetrue);
          5     }

          執行上面的單元測試,數據庫中生成的表結構圖 :



          從上面的圖可以看出,多出了一張中間表,這張中間表是冗余的,它沒有必要存在,它之所以存在,這是因為 hibernate 在默認的情況下,

          會將 OneToMany 當成是 ManyToMany 的一種特殊情況,故而生成了一張中間表。想要去掉這張中間表只需要加上 @JoinColumn 注解即可 :

          1     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
          2     @JoinColumn(name = "farm_id")
          3     public Set<Plant> getPlantSet() {
          4         return plantSet;
          5     }

          再次執行單元測試 ( 注意要手動刪除之前生成的表,因為有中間表的存在,中間表參考了與它關聯的主表,這種情況下 hibernate 無法幫我們刪除表 )




          級聯保存 :

           1     private static Session session;
           2     
           3     @BeforeClass
           4     public static void beforeClass(){
           5         
           6         session = new AnnotationConfiguration().configure().buildSessionFactory().getCurrentSession();
           7     }
           8     
           9     @Test
          10     public void insert(){
          11         try {
          12             Plant tomato  = new Plant();
          13             tomato.setName("番茄");
          14             Plant cabbage = new Plant();
          15             cabbage.setName("卷心菜");
          16             Set<Plant> plantSet = new HashSet<Plant>();
          17             plantSet.add(tomato);
          18             plantSet.add(cabbage);
          19             Farm farm = new Farm();
          20             farm.setName("fancy-farm");
          21             farm.setPlantSet(plantSet);
          22             session.beginTransaction();
          23             session.persist(farm);
          24             session.getTransaction().commit();
          25         } catch (Exception e) {
          26             e.printStackTrace();
          27         }
          28     }



            
          posted on 2012-10-21 08:04 fancydeepin 閱讀(3971) 評論(1)  編輯  收藏

          評論:
          # re: hibernate annotation 之 一對多單向外鍵關聯 2013-07-07 19:45 | sendreams
          lz,你好,請教你文中圖片是用什么工具生成的?還望告知,謝謝!  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 浦江县| 会同县| 阿巴嘎旗| 乌兰察布市| 馆陶县| 镇坪县| 都江堰市| 南京市| 城市| 淄博市| 城固县| 苏州市| 沙坪坝区| 和龙市| 宁明县| 喀什市| 怀柔区| 石城县| 崇阳县| 平塘县| 嘉禾县| 阳新县| 莒南县| 咸丰县| 兖州市| 沁阳市| 巴林右旗| 贺兰县| 连州市| 汕头市| 辽中县| 富宁县| 璧山县| 怀仁县| 天门市| 游戏| 新蔡县| 曲麻莱县| 临安市| 南靖县| 云梦县|