<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

    主站蜘蛛池模板: 亚洲精品偷拍无码不卡av| 亚洲第一区二区快射影院| 在免费jizzjizz在线播| 亚洲色www永久网站| 超清首页国产亚洲丝袜| 啦啦啦完整版免费视频在线观看 | 国产精品99久久免费观看| 亚洲乱码一二三四区乱码| mm1313亚洲精品无码又大又粗| 玖玖在线免费视频| 亚洲AV香蕉一区区二区三区| 亚洲午夜福利717| 在线播放免费人成视频在线观看| 久久国产一片免费观看| 亚洲无人区码一二三码区别图片 | 久久91亚洲精品中文字幕| 成年性羞羞视频免费观看无限| 中国在线观看免费的www| 国产成人亚洲综合网站不卡| 日韩亚洲变态另类中文| 女人18毛片a级毛片免费 | 亚洲欧洲精品成人久久奇米网 | 亚洲人成网站在线播放vr| 毛色毛片免费观看| 免费国产黄网站在线观看| 免费人成网站永久| 97se亚洲国产综合自在线| 亚洲成AV人片一区二区| 免费大香伊蕉在人线国产| 国产成人精品久久免费动漫| 中文字幕在线成人免费看| 亚洲a无码综合a国产av中文| 91亚洲国产成人久久精品网址| 亚洲欧洲日产国码无码网站| 国产免费牲交视频| 在线v片免费观看视频| 久久永久免费人妻精品| 一个人看的在线免费视频| 亚洲第一第二第三第四第五第六| 久久精品国产亚洲AV高清热 | 香港特级三A毛片免费观看|