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

資訊專欄INFORMATION COLUMN

相對的一對多和多對一,hibernate很傷神

tianlai / 2345人閱讀

摘要:一對多和多對一一和多的概念通過以上的分析,我們知道一對多和多對一的關系。一對多和多對一的理論示例所以,一和多之間,并非絕對的關系,只是相對來說。項目和項目階段也是一對多和多對一的關系。評論表和用戶文章也是一對多和多對一的關系。

導讀

最近公司在做這樣的一個業務,由我來設計數據庫,其中有有一個需求,根據原型圖設計數據庫,這也是我第一次獨立設計數據庫,因涉及公司的機密,只能展示部分原型圖:

1、如圖是項目的原型圖,每個項目都是一條記錄,因而,這可以設計成獨立的項目表

2、當點擊紅框中的“人員”,就會出現一個彈框,彈框如圖所示。

這是項目人員,自然關聯對應項目。不同的項目可能有不同的人員。因而,這可以設計成一張項目人員表。表中的字段肯定有“人員類型”,比如業務員,業務部經理等。外鍵自然是項目主鍵。一個項目可能會有多條記錄,比如說業務員一條記錄,業務部經理一條記錄等。所以,對于項目而言,這是一對多的關系,是什么意思呢?一個項目在項目人員表有多條記錄;但對于項目人員來說,這是多對一的關系,多條項目人員的記錄對著一個項目。如圖所示:

生成數據表結構是有Java代碼生成的,因而,代碼如下:

/**
 * Created By zby on 15:00 2018/12/25
 * 項目人員
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(name = "zq_project_person")
public class ProjectPerson extends BaseObj {

    /**
     * 人員類型
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "person_type")
    private PersonTypeEnum personType;

    /**
     * 人員的ids,存儲人員的編號
     */
    @Column(name = "ids")
    private String ids;

    /**
     * 選擇時間
     */
    @Column(name = "op_time")
    private Date opTime;

    /**
     * 項目
     */
    @ManyToOne
    @JoinColumn(name = "project_id")
    private Project project;

}

人員類型是枚舉,代碼如下:

/**
 * Created By zby on 9:43 2018/12/27
 */
public enum PersonTypeEnum implements TitleEnum {
    PERSON_TYPE_SALESMAN("業務員"),
    PERSON_TYPE_SALESMAN_MANAGER("業務部經理"),
    PERSON_TYPE_DESIGNER("設計師"),
    PERSON_TYPE_DESIGNER_MANAGER("設計部經理"),
    PERSON_TYPE_PROJECT_SUPERVISION("工程監理"),
    PERSON_TYPE_ENGINEERING_MANAGER("工程部經理");

    。。。
一對多和多對一 一和多的概念

通過以上的分析,我們知道一對多和多對一的關系。這個“一”“多”。到底是什么是 “一”,什么又是“多”呢?在實際的項目中,我們多問幾個為什么,成長也會特別的快。不要怕問,也許,人家可能沒時間回答你,或許,人家害怕把你教會了。這樣,也要問,不問就永遠不知道。

“一”針對“一個點”來說,就像是spring中的aop(Aspect Oriented Programming)編程一樣。spring框本身就是以算法驅動為開發,但我們在使用它時,一般是以業務驅動為開發的。既然是業務處理,自然涉及到業務的諸多流程,比如,專門將JVM中的瞬時態的對象轉化為數據庫的持久態的字段值、或將數據庫的持久態的字段值轉化為瞬時態的Java對象的dao(data access object)層;專門處理數據庫事務相關的事務層(service層);專門處理接受前端數據和返回前端數據的控制層(controller層)。

我們單單只考慮其中的一個業務流程,即數據庫的事務層(service層)。這就是一個點,也就是aop需要考慮的一個點。aop的配置文件如下所示:




    
    
      
    
    
        
    

    

    
    

    
    
        
            
            
            
            
            
            

            
        
    
    

我們注意上面的 。。。這段代碼,其實就是配置的設置這個點。這個是處理所有以service結尾的。

因而,再說說我們數據的庫的 “一”,這是針對一條記錄來說的,比如上文說到的項目表中有很多項目,我們單單舉出來編號為167的項目,那么,這就是 “一”。“多”我們針對的是當前數據表中涉及到外鍵字段的記錄的條數。比如在項目人員表中,外鍵名為project_id的項目編號等于167的有很多條記錄。那么,這就是“多”

一對多和多對一的理論示例

所以,一和多之間,并非絕對的關系,只是相對來說。就像我們初中學過的運動間的相對關系。什么是靜止的,什么是運動的?我們坐在車廂里,相對于窗外的行道樹,我們是運動的。相對于車子,我們就是靜止的。所以,也有句話,叫做日行不動八萬里。萬物就是這樣,沒有絕對的關系。因而,在實際的項目中,我們遇到了太多的一對多(多對一)的關系,比如:

項目和項目人員就是一個典型的一對多和多對一的關系。因為上文提到了,就不再贅述。

項目和項目階段也是一對多和多對一的關系。一個項目從執行到竣工,肯定有很多的階段,每個階段的執行時間、階段名稱、涉及到的人等。因而,這也是一對多的關系。所以,在項目階段表中相同項目編號的記錄至少零條。

評論表和用戶、文章也是一對多和多對一的關系。比如我在思否寫了篇文章,當其他用戶登錄了,假設評論我的文章,一個用戶可以評論多次一篇文章,一個用戶也可以評論我的多篇文章。所以,在評論表中,一個用戶的記錄至少零條,一個用戶的文章的記錄數至少零條。

同一張表中也可以存在一對多的關系。如文章類型這張表,文章類型肯定有父類型。在這張表中,父類型至少有零條記錄數。如欄目,欄目肯定有父類型,父欄目下面有子欄目,父欄目的記錄至少有零條。

根據4所說的,一個文章類型下面有多篇文章,這也是典型的一對多;一個欄目下面有多個內容,這也是典型的一對多。

。。。再有的話,歡迎評論。

以項目人員為示例

業務需求

我們只有點擊選擇人員,才將數據保存到數據庫中,但是,我們還是要將人員類型按照順序展示出來。因而,我們需要考慮的是,判斷數據庫中是否存在某種人員類型,比如業務員類型,業務部經理類型。

存在,就把數據表的對象取出來,然后填充到集合容器中。

不存在,我們就要把數據庫中不存在的人員類型填充到集合容器中。

算法思想:

在做項目之前,我們需要考慮算法,否則,做出來的東西雖然沒錯,但不是業務所需要的。

我們從數據庫中取出當前項目下的項目人員的記錄,即 List projectList = projectPersonDao.listProjectPersons(projectId);

我們獲取枚舉對象的數組,然后遍歷枚舉集合,即 for (PersonTypeEnum obj : PersonTypeEnum.class.getEnumConstants());

設置一個開關,true 表示數據存在該枚舉對象,false 表示數據庫不存在該枚舉對象,即 boolean objInProjectPerson = false;

再遍歷projectList ,獲取項目人員的對象,拿到人員類型的對象,與枚舉對象進行比較,如果相等,就objInProjectPerson置為true,然后挑出內循環。

判斷objInProjectPerson狀態,如果未false,就將人員類型的對象設置為當前枚舉對象。

最后,通過 projectPersonList.sort(Comparator c)方法進行排序。因為方法形參的是Comparator接口,因而,我們需要一方法內部類的方式實現排序。

方法實現

通過上文的算法設計,我們編寫實現方法:

    @Override
    public Result> listProjectPersons(Long projectId) {
//        【1】步驟一
        List projectList = projectPersonDao.listProjectPersons(projectId);
        List projectPersonList = new ArrayList<>();
        Class clz = PersonTypeEnum.class;
        //        【2】步驟二
        for (PersonTypeEnum obj : clz.getEnumConstants()) {
            //        【3】步驟三
            boolean objInProjectPerson = false;
            for (ProjectPerson projectPerson : projectList) {
                //        【4】步驟四
                if (obj.equals(projectPerson.getPersonType())) {
                    projectPerson.setSort(obj.ordinal());
                    objInProjectPerson = true;
                    projectPersonList.add(projectPerson);
                    break;
                }
            }
            //        【5】步驟五
            if (!objInProjectPerson) {
                ProjectPerson projectPerson = new ProjectPerson();
                projectPerson.setPersonType(obj);
                projectPerson.setSort(obj.ordinal());
                projectPersonList.add(projectPerson);
            }
        }
        //        【6】步驟6
        projectPersonList.sort(new Comparator() {
            @Override
            public int compare(ProjectPerson firstProjectPerson, ProjectPerson secondProjectPerson) {
                return firstProjectPerson.getSort() - secondProjectPerson.getSort();
            }
        });
        return ResultUtil.buildSuccess(projectPersonList);
    }
總結

我們在開發過程中和,要分明白何時以業務驅動為開發對象,何時以算法驅動為開發對象。這樣,做一個有條理的人,你就會獲得更多的知識。

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

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

相關文章

  • Hibernate【映射】知識要點

    摘要:前言前面的我們使用的是一個表的操作,但我們實際的開發中不可能只使用一個表的因此,本博文主要講解關聯映射集合映射需求分析當用戶購買商品,用戶可能有多個地址。數據庫表我們一般如下圖一樣設計數據庫表,一般我們不會在表設計多個列來保存地址的。 前言 前面的我們使用的是一個表的操作,但我們實際的開發中不可能只使用一個表的...因此,本博文主要講解關聯映射 集合映射 需求分析:當用戶購買商品,用戶...

    TesterHome 評論0 收藏0
  • hibernate多對多,單個修改傷神

    摘要:因為的沒有依賴模塊,因而,數據字典無法調用模塊中的項目類,如圖所示因而,如果我們采用這種方式創建多對多的關系,會破壞結構或者框架結構。如圖所示項目和圖片的關系,一個項目有很多張圖片,但是一張圖片也可以被多個項目使用。。。。。 導讀 showImg(https://segmentfault.com/img/bVbpz67?w=1056&h=425); 客戶單擊項目詳細時,會跳轉到項目詳細...

    zzzmh 評論0 收藏0
  • Hibernate延遲加載

    摘要:非集合屬性非集合屬性的延遲加載相對比較復雜。僅通過注解是無法實現延遲加載的。但是在一對一關系中,延遲加載是有陷阱的。這樣一來,就會立即為配置延遲加載的實體生成一個動態代理類。 Hibernate中,延遲加載針對屬性類別可以分為兩類,一類是延遲屬性加載,另一類是延遲關聯實體加載。 屬性延遲加載 屬性有可以分為兩種類型:一種是集合屬性,一種是非集合屬性(如String、Integer……)...

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

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

    gougoujiang 評論0 收藏0

發表評論

0條評論

tianlai

|高級講師

TA的文章

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