成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

tianlai / 2349人閱讀

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

導(dǎo)讀

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

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

2、當(dāng)點擊紅框中的“人員”,就會出現(xiàn)一個彈框,彈框如圖所示。

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

生成數(shù)據(jù)表結(jié)構(gòu)是有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("業(yè)務(wù)員"),
    PERSON_TYPE_SALESMAN_MANAGER("業(yè)務(wù)部經(jīng)理"),
    PERSON_TYPE_DESIGNER("設(shè)計師"),
    PERSON_TYPE_DESIGNER_MANAGER("設(shè)計部經(jīng)理"),
    PERSON_TYPE_PROJECT_SUPERVISION("工程監(jiān)理"),
    PERSON_TYPE_ENGINEERING_MANAGER("工程部經(jīng)理");

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

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

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

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




    
    
      
    
    
        
    

    

    
    

    
    
        
            
            
            
            
            
            

            
        
    
    

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

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

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

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

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

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

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

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

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

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

以項目人員為示例

業(yè)務(wù)需求

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

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

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

算法思想:

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

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

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

設(shè)置一個開關(guān),true 表示數(shù)據(jù)存在該枚舉對象,false 表示數(shù)據(jù)庫不存在該枚舉對象,即 boolean objInProjectPerson = false;

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

判斷objInProjectPerson狀態(tài),如果未false,就將人員類型的對象設(shè)置為當(dāng)前枚舉對象。

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

方法實現(xiàn)

通過上文的算法設(shè)計,我們編寫實現(xiàn)方法:

    @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);
    }
總結(jié)

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73643.html

相關(guān)文章

  • Hibernate【映射】知識要點

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

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

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

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

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

    jollywing 評論0 收藏0
  • Hibernate映射關(guān)系

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

    gougoujiang 評論0 收藏0

發(fā)表評論

0條評論

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