<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(463) 評論(0)  編輯  收藏 所屬分類: Hibernate

    主站蜘蛛池模板: 亚洲AV无码专区国产乱码4SE| 3d成人免费动漫在线观看| 成全视频在线观看免费高清动漫视频下载 | 女人被男人躁的女爽免费视频| 亚洲综合在线成人一区| 无码人妻一区二区三区免费n鬼沢| 亚洲午夜未满十八勿入网站2| 国产高清视频免费在线观看| 伊人久久大香线蕉亚洲| 在线播放免费人成毛片乱码| 亚洲国产精品线在线观看| 91福利免费视频| 亚洲一区二区三区久久久久| 免费99精品国产自在现线| 亚洲av色香蕉一区二区三区蜜桃| 暖暖在线日本免费中文| 一边摸一边爽一边叫床免费视频| 国产亚洲精品无码专区| 中国好声音第二季免费播放| 久久久久亚洲av无码专区| 久久久www成人免费毛片| 国产亚洲午夜精品| 国产V亚洲V天堂A无码| 91成人免费观看网站| 爱爱帝国亚洲一区二区三区| 亚洲尤码不卡AV麻豆| 精品久久8x国产免费观看| 亚洲av无码一区二区三区四区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 蜜臀AV免费一区二区三区| 亚洲偷偷自拍高清| 亚洲国产成人a精品不卡在线| 久久99免费视频| 国产精品高清视亚洲精品| 亚洲女人被黑人巨大进入| 中文字幕天天躁日日躁狠狠躁免费| 亚洲а∨精品天堂在线| 亚洲国产精品一区二区第一页 | 99国产精品免费观看视频| 亚洲色www永久网站| 亚洲精品国产字幕久久不卡|