摘要:因為的沒有依賴模塊,因而,數據字典無法調用模塊中的項目類,如圖所示因而,如果我們采用這種方式創建多對多的關系,會破壞結構或者框架結構。如圖所示項目和圖片的關系,一個項目有很多張圖片,但是一張圖片也可以被多個項目使用。。。。。
導讀
客戶單擊項目詳細時,會跳轉到項目詳細頁面。用戶單擊紅框中的加號,頁面彈出選擇標簽頁面。用戶單擊待選標簽中的標簽,當前標簽會被保存到數據庫中。
當然,項目標簽與項目之間是多對多的關系,也就是說,一個項目可以有多個標簽,一個標簽對應多個項目,總體來說,它們之間是多對多的關系。
多對多的關系多也是相對的多,就像導讀中的項目和項目標簽一樣。這是從宏觀上來說的多對多,但從微觀上來看,其內部還是一對多的關系。一個項目可以有多個項目標簽,一個項目標簽可以對應多個項目。既然對各自來說,都是一對多的關系,為什么不這樣寫呢:
// 項目表 @Entity @Table(name = "zq_project") public class Project extends BaseObj { /** * 項目標簽 */ @ManyToOne @JoinColumn(name = "attach_id") private Listtagss; } //項目標簽表 @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 ListtagList;
因為這樣書寫,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 ListtagList; }
因為項目標簽時多對多的關系,當我們接收到前端傳過來的項目編號,并調用項目的事務的get方法,創建當前項目瞬時態的對象時。hibernate根據項目標簽表中的code值,創建項目標簽(數據字典)的集合對象,并填充到tagList的集合中。我們只要在對集合對象上,添加從前端傳過的code值,并通過code值創建項目標簽(數據字典)的對象即可。因而,代碼改成下面的方式:
這樣保存就沒問題了。
結尾如果我們掌握了最基本知識是,就可以很容易掌握其他語言了。加油,致自己。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73636.html
摘要:一對多和多對一一和多的概念通過以上的分析,我們知道一對多和多對一的關系。一對多和多對一的理論示例所以,一和多之間,并非絕對的關系,只是相對來說。項目和項目階段也是一對多和多對一的關系。評論表和用戶文章也是一對多和多對一的關系。 導讀 最近公司在做這樣的一個業務,由我來設計數據庫,其中有有一個需求,根據原型圖設計數據庫,這也是我第一次獨立設計數據庫,因涉及公司的機密,只能展示部分原型圖:...
時間:2017年07月11日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:應用場景 1-1 多對多的應用場景 案例分析:企業項目開發過程中 一個項目可由多個員工參與開發 一個員工可同時參與開發多個項目 示意圖 showImg(https://segmentfau...
摘要:前言首先聲明,這是一篇轉發博客,不屬于原創。關系映射有下面幾種類型一對一外鍵關聯映射單向一對一外鍵關聯,使用,并設置了級聯操作。設置了外鍵的名稱為數據庫字段名,如果不設置,則默認為另一類的屬性名,外鍵的值是唯一的。 前言 首先聲明,這是一篇轉發博客,不屬于原創。但是感覺很有用,所以在本人的博客中記錄下來。 Hibernate Annotation關系映射有下面幾種類型: 一對一...
閱讀 2142·2023-04-26 00:00
閱讀 3239·2021-09-24 10:37
閱讀 3528·2021-09-07 09:58
閱讀 1518·2019-08-30 15:56
閱讀 2217·2019-08-30 13:11
閱讀 2311·2019-08-29 16:38
閱讀 959·2019-08-29 12:58
閱讀 1876·2019-08-27 10:54