honzeland

          記錄點滴。。。

          常用鏈接

          統計

          Famous Websites

          Java

          Linux

          P2P

          最新評論

          Hibernate Annotations

          Use one single table "blank_fields" for both A and B. "blank_fields" has fields: 'ref_id', 'blank_field', 'type'. 'type' is used to identify which entity the record belongs to. Use 'type' + 'ref_id' to specify the collection of elements for one entity.

          @Entity
          @Table(name 
          = "table_a")
          public class A {
              
          private Set<BlankField> blankFields = new HashSet<BlankField>();
             
              @CollectionOfElements
              @Fetch(FetchMode.SUBSELECT)
              @Enumerated(EnumType.ORDINAL)
              @JoinTable(name 
          = "blank_fields", joinColumns = { @JoinColumn(name = "ref_id") })
              @Cascade(value 
          = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
              @Column(name 
          = "blank_field", nullable = false)
              @SQLInsert(sql 
          = "INSERT INTO blank_fields(ref_id, blank_field, type) VALUES(?,?,0)")
              @Where(clause 
          = "type=0")
              
          public Set<BlankField> getBlankFields() { // BlankField is an enum
                  
          return blankFields;
              }

              @SuppressWarnings(
          "unused")
              
          private void setBlankFields(Set<BlankField> blankFields) {
                  
          this.blankFields = blankFields;
              }
          // End B

          @Entity
          @Table(name 
          = "table_b")
          public class B {
              
          private Set<BlankField> blankFields = new HashSet<BlankField>();
             
              @CollectionOfElements
              @Fetch(FetchMode.SUBSELECT)
              @Enumerated(EnumType.ORDINAL)
              @JoinTable(name 
          = "blank_fields", joinColumns = { @JoinColumn(name = "ref_id") })
              @Cascade(value 
          = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
              @Column(name 
          = "blank_field", nullable = false)
              @SQLInsert(sql 
          = "INSERT INTO blank_fields(ref_id, blank_field, type) VALUES(?,?,1)"// used for insert
              @Where(clause = "type=1"// used for query, if not @CollectionOfElements, such as @OneToMany, use @WhereJoinTable instead
              public Set<BlankField> getBlankFields() {
                  
          return blankFields;
              }

              @SuppressWarnings(
          "unused")
              
          private void setBlankFields(Set<BlankField> blankFields) {
                  
          this.blankFields = blankFields;
              }
          }

          當然還有其他的方式來實現上面的需求,上面采用的單表來記錄不同實體的associations(這兒是CollectionOfElements,并且返回的是Set<Enum>,不是Set<Embeddable>),然后用'type'來區分不同的實體,這樣做的好處是:數據庫冗余少,易于擴展,對于新的實體,只需加一個type值,而不需更改數據庫表結構。另外一種采用單表的方式是為每個實體增加新的字段,如
          "blank_fields": 'a_id', 'b_id', 'blank_field', a_id reference table_a (id), b_id reference table_b (id). 這樣在映射的時候更簡單,
          對于A,映射為
          @JoinTable(name = "blank_fields", joinColumns = { @JoinColumn(name = "a_id") })
          對于B,映射為
          @JoinTable(name = "blank_fields", joinColumns = { @JoinColumn(name = "b_id") })
          這樣作的缺點是:帶來了數據庫冗余,對于blank_fields來講,任一條記錄,a_id和b_id中只有一個不為null。當多個實體共用這個表時,用上面的方法更合理,如果共用實體不多時,這種方法更方便。

          posted on 2010-04-20 17:20 honzeland 閱讀(455) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 左贡县| 巴里| 合阳县| 图木舒克市| 盐源县| 绥滨县| 黄浦区| 盱眙县| 扎鲁特旗| 东乌珠穆沁旗| 阿城市| 措勤县| 望城县| 明溪县| 视频| 云梦县| 滦南县| 湖口县| 永靖县| 穆棱市| 福清市| 陵水| 兴山县| 长兴县| 青铜峡市| 婺源县| 白玉县| 秦皇岛市| 高州市| 墨竹工卡县| 沛县| 望江县| 聊城市| 武平县| 台州市| 宣化县| 元朗区| 十堰市| 高雄市| 黄石市| 平顺县|