国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

hibernate多對多,單個修改很傷神

zzzmh / 2614人閱讀

摘要:因為的沒有依賴模塊,因而,數據字典無法調用模塊中的項目類,如圖所示因而,如果我們采用這種方式創建多對多的關系,會破壞結構或者框架結構。如圖所示項目和圖片的關系,一個項目有很多張圖片,但是一張圖片也可以被多個項目使用。。。。。

導讀

客戶單擊項目詳細時,會跳轉到項目詳細頁面。用戶單擊紅框中的加號,頁面彈出選擇標簽頁面。用戶單擊待選標簽中的標簽,當前標簽會被保存到數據庫中。

當然,項目標簽與項目之間是多對多的關系,也就是說,一個項目可以有多個標簽,一個標簽對應多個項目,總體來說,它們之間是多對多的關系。

多對多的關系

多也是相對的多,就像導讀中的項目和項目標簽一樣。這是從宏觀上來說的多對多,但從微觀上來看,其內部還是一對多的關系。一個項目可以有多個項目標簽,一個項目標簽可以對應多個項目。既然對各自來說,都是一對多的關系,為什么不這樣寫呢:

// 項目表
@Entity
@Table(name = "zq_project")
public class Project extends BaseObj {
 /**
 * 項目標簽
 */
    @ManyToOne
    @JoinColumn(name = "attach_id")
    private List tagss;
}

//項目標簽表
@Entity
@Table(name = "core_data_dict", uniqueConstraints = {@UniqueConstraint(columnNames = {"tenant_id", "code"}, name = "uk_dd_tid_code")})
public class DataDict extends ToString{

  /**
   * 項目
  */
    @ManyToOne
    @JoinColumn(name = "attach_id")
    private List projectList;
    
}

而是這樣書寫方式呢?

 /**
     * 添加項目標簽,如果是標簽來源于數據字典,則可以直接讀取數據字典
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    @JoinTable(
            name = "zq_project_tags",
            joinColumns = {@JoinColumn(name = "project_id")},
            inverseJoinColumns = @JoinColumn(name = "tag_code")
    )
    @JSONField(serialize = false)
    private List tagList;

因為這樣書寫,hibernate會根據項目和數據字典(項目標簽放在數據字典表中)生成一個中間表,如圖所示:

為什么不采用第一種方式呢?
1、第一種方式擴展性不好,破壞框架結構,為什么這么說?

項目標簽放置在數據字典中,換句話,數據字典所存儲的數據集不會經常改變。就像我們的新華字典,不會時常做版本更新。因而,類似于項目標簽,數值型的單位呀、系統標量等,這些數據都不會時常改變。

而且,現在的項目都采用maven構建,什么是maven項目呢?很多博客都有詳細介紹,我只做簡單地介紹。maven是項目對象模型(POM),舉一個簡單的例子,我們在不使用maven創建項目時,往往需要拷貝jar包到項目中。然而,我們使用maven創建項目時,就會創建一個pom文件。我們在pomp文件中做配置,如果需要新的jar包,我們直接使用...

  
    com.alibaba
    fastjson
    ${fastjson.version}
  

當然,引用jar包是一回事,還有模塊化構建項目。我們經常分模塊構建項目,比如信息發布一個模塊,核心層一個模塊,自定義業務層一個模塊。各個模塊之間就像是Java一樣,具有繼承和關聯關系。子pom文件可以使用父pom的所有jar包。如圖所示:

層級非常嚴格,即便在同一個項目不同的模塊中,我們如果想要調用另外一個模塊的類時,也需要用dependency來引用其模塊。比如,我們想要在platform-custom層調用platform-core層的類,我們需要在platform-custom的pom文件中寫入依賴:

  
    com.zfounder.platform
    platform-core
   

但是,項目表是自定義業務范疇的,是在platform-custom模塊中的,而數據字典是屬于platform-core模塊的。因為platform-core的pom沒有依賴platform-custom模塊,因而,數據字典無法調用platform-custom模塊中的項目類,如圖所示:

因而,如果我們采用這種方式創建多對多的關系,會破壞maven結構或者框架結構。

2、對于數據庫的維護性不好。
對于項目來說,相同項目標簽的可能有數條項目的記錄,但是,每個項目都是唯一的,一個項目應該有多個標簽,但現在的問題是,同一個項目的編號不同了,因為不同的項目標簽,這就破壞了數據庫的唯一性。

針對以上兩種情況,我們應該使用中間表,來創建多對多的關系。如圖所示:

這樣簡潔明快,也便于日后的維護工作。

哪些是多對多的關系

1、用戶和角色之間的關系,一個用戶可以有多重角色,一個角色可以對應多個用戶。
2、既然說到了角色,自然說到角色所能管理的權限,比如當用戶登錄,根據用戶的角色,需要展示哪些頁面,可以操作該頁面的哪些按鈕,等等。這些都放在資源表中。如圖所示:


3、項目和圖片的關系,一個項目有很多張圖片,但是一張圖片也可以被多個項目使用。
4、。。。。

中間表一般都涉及兩個字段,字段分別引用兩張表的主鍵。

多對多的實例,以選擇項目標簽為例

我們在點擊保存項目標簽時,心想我們點擊一次,保存一次,而項目類中項目標簽對象是一個集合對象,我們應該創建這個集合,然后拿到前端傳

過來的項目標簽的code值(數據字典對應的是code值),通過數據字典的事務方法獲取這個數據字典對象,再判斷該對象的父類是不是項目標簽。因為數據字典存儲很多類字典,比如項目標簽字典、單位字典、系統變量字典等等。然后保存這個數據字典,但結果事與愿違,它會覆蓋數據庫中原來的數據,這是更新數據,而不是保存數據,如圖所示:

為什么會這樣,因為,其底層使用的是merge方法,如代碼所示:

 /**
 * @see com.zfounder.platform.core.dao.GenericDao#save(T)
 */
@SuppressWarnings("unchecked")
@Override
public T save(T object) {
    Session session = getSession();
    return (T) session.merge(object);
}

merger如果發現數據庫存在該編號的對象,則執行update操作;如果不存在,則執行insert操作。因而,中間表,即項目標簽表,已經存在該項目編號的id,所以,執行更新操作。

我們換一種思路,首先看項目類的部分源碼:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "zq_project")
public class Project extends BaseObj {

    /**
     * 項目名稱
     */
    @Column(name = "name")
    private String name;
    
    /**
     * 錄入日期
     */
    @Column(name = "sign_date")
    private Date signDate;

    /**
     * 備注
     */
    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "remark", columnDefinition = "mediumtext")
    private String remark;

    /**
     * 預算金額
     */
    @Column(name = "budgetary_amount", precision = 10, scale = 2)
    private BigDecimal budgetaryAmount;
 
    /**
     * 工程起始時間
     */
    @Column(name = "start_time")
    private Date startTime;

    /**
     * 工程結束時間
     */
    @Column(name = "end_time")
    private Date endTime;

    /**
     * 添加項目標簽,如果是標簽來源于數據字典,則可以直接讀取數據字典
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    @JoinTable(
            name = "zq_project_tags",
            joinColumns = {@JoinColumn(name = "project_id")},
            inverseJoinColumns = @JoinColumn(name = "tag_code")
    )
    @JSONField(serialize = false)
    private List tagList;
}

因為項目標簽時多對多的關系,當我們接收到前端傳過來的項目編號,并調用項目的事務的get方法,創建當前項目瞬時態的對象時。hibernate根據項目標簽表中的code值,創建項目標簽(數據字典)的集合對象,并填充到tagList的集合中。我們只要在對集合對象上,添加從前端傳過的code值,并通過code值創建項目標簽(數據字典)的對象即可。因而,代碼改成下面的方式:

這樣保存就沒問題了。

結尾

如果我們掌握了最基本知識是,就可以很容易掌握其他語言了。加油,致自己。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73636.html

相關文章

  • 相對的一對多多對一,hibernate傷神

    摘要:一對多和多對一一和多的概念通過以上的分析,我們知道一對多和多對一的關系。一對多和多對一的理論示例所以,一和多之間,并非絕對的關系,只是相對來說。項目和項目階段也是一對多和多對一的關系。評論表和用戶文章也是一對多和多對一的關系。 導讀 最近公司在做這樣的一個業務,由我來設計數據庫,其中有有一個需求,根據原型圖設計數據庫,這也是我第一次獨立設計數據庫,因涉及公司的機密,只能展示部分原型圖:...

    tianlai 評論0 收藏0
  • 慕課網_《Hibernate初探之對多映射》學習總結

    時間:2017年07月11日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:應用場景 1-1 多對多的應用場景 案例分析:企業項目開發過程中 一個項目可由多個員工參與開發 一個員工可同時參與開發多個項目 示意圖 showImg(https://segmentfau...

    caozhijian 評論0 收藏0
  • Hibernate映射關系

    摘要:前言首先聲明,這是一篇轉發博客,不屬于原創。關系映射有下面幾種類型一對一外鍵關聯映射單向一對一外鍵關聯,使用,并設置了級聯操作。設置了外鍵的名稱為數據庫字段名,如果不設置,則默認為另一類的屬性名,外鍵的值是唯一的。 前言 首先聲明,這是一篇轉發博客,不屬于原創。但是感覺很有用,所以在本人的博客中記錄下來。 Hibernate Annotation關系映射有下面幾種類型: 一對一...

    gougoujiang 評論0 收藏0

發表評論

0條評論

zzzmh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<