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

資訊專(zhuān)欄INFORMATION COLUMN

相對(duì)的一對(duì)多和多對(duì)一,hibernate很傷神

tianlai / 2344人閱讀

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

導(dǎo)讀

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

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

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

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

生成數(shù)據(jù)表結(jié)構(gòu)是有Java代碼生成的,因而,代碼如下:

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

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

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

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

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

}

人員類(lèi)型是枚舉,代碼如下:

/**
 * 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è)計(jì)師"),
    PERSON_TYPE_DESIGNER_MANAGER("設(shè)計(jì)部經(jīng)理"),
    PERSON_TYPE_PROJECT_SUPERVISION("工程監(jiān)理"),
    PERSON_TYPE_ENGINEERING_MANAGER("工程部經(jīng)理");

    。。。
一對(duì)多和多對(duì)一 一和多的概念

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

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

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




    
    
      
    
    
        
    

    

    
    

    
    
        
            
            
            
            
            
            

            
        
    
    

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

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

一對(duì)多和多對(duì)一的理論示例

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

項(xiàng)目和項(xiàng)目人員就是一個(gè)典型的一對(duì)多和多對(duì)一的關(guān)系。因?yàn)樯衔奶岬搅耍筒辉儋樖觥?/p>

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

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

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

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

。。。再有的話,歡迎評(píng)論。

以項(xiàng)目人員為示例

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

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

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

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

算法思想:

在做項(xiàng)目之前,我們需要考慮算法,否則,做出來(lái)的東西雖然沒(méi)錯(cuò),但不是業(yè)務(wù)所需要的。

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

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

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

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

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

最后,通過(guò) projectPersonList.sort(Comparator c)方法進(jìn)行排序。因?yàn)榉椒ㄐ螀⒌氖荂omparator接口,因而,我們需要一方法內(nèi)部類(lèi)的方式實(shí)現(xiàn)排序。

方法實(shí)現(xiàn)

通過(guò)上文的算法設(shè)計(jì),我們編寫(xiě)實(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é)

我們?cè)陂_(kāi)發(fā)過(guò)程中和,要分明白何時(shí)以業(yè)務(wù)驅(qū)動(dòng)為開(kāi)發(fā)對(duì)象,何時(shí)以算法驅(qū)動(dòng)為開(kāi)發(fā)對(duì)象。這樣,做一個(gè)有條理的人,你就會(huì)獲得更多的知識(shí)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73643.html

相關(guān)文章

  • Hibernate【映射】知識(shí)要點(diǎn)

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

    TesterHome 評(píng)論0 收藏0
  • hibernate多對(duì)多,單個(gè)修改傷神

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

    zzzmh 評(píng)論0 收藏0
  • Hibernate延遲加載

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

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

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

    gougoujiang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<