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

    主站蜘蛛池模板: 鲁啊鲁在线视频免费播放| 成年大片免费视频播放一级| 成年女人喷潮毛片免费播放| 免费人成再在线观看网站| 亚洲综合激情六月婷婷在线观看| 四只虎免费永久观看| 国产精品免费观看久久| 日韩电影免费在线观看中文字幕| 2020国产精品亚洲综合网| 亚洲一区二区在线免费观看| 亚洲精品无码永久中文字幕| 国产精品免费一级在线观看| 波多野结衣中文字幕免费视频| 三年片免费高清版| 91免费福利视频| 免费无码黄网站在线看| 国产成人免费ā片在线观看老同学| 免费精品国产自产拍在线观看| 亚洲爆乳无码精品AAA片蜜桃| 亚洲成a人片在线观看精品| 亚洲国产精品专区| 亚洲中文字幕无码av| 国产亚洲综合精品一区二区三区| 精品无码专区亚洲| 一区二区三区免费高清视频| 2021精品国产品免费观看| 久久夜色精品国产亚洲AV动态图 | 国产91在线免费| 成人性生交大片免费看午夜a| 免费的涩涩视频在线播放| 成年美女黄网站色大免费视频| 国产福利免费观看| 久久乐国产精品亚洲综合| 亚洲国产精品久久| 老司机午夜精品视频在线观看免费| 一区视频免费观看| 成人午夜免费福利| 亚洲伊人久久大香线蕉苏妲己| 亚洲av无码片vr一区二区三区 | 九九精品免费视频| 77777亚洲午夜久久多人|