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

資訊專欄INFORMATION COLUMN

JPA關(guān)系映射

Faremax / 1892人閱讀

摘要:關(guān)系映射四種映射關(guān)系在關(guān)系數(shù)據(jù)庫中有表與表存在下面幾種關(guān)系多對一關(guān)系一對一關(guān)系一對多關(guān)系多對多關(guān)系也對應(yīng)這中四種映射關(guān)系單值串聯(lián)從一個(gè)實(shí)體實(shí)例關(guān)聯(lián)到另一個(gè)實(shí)體實(shí)例上其中目標(biāo)基數(shù)為成為單值關(guān)聯(lián)多對一關(guān)系和一對一關(guān)系都是屬于這

JPA關(guān)系映射 四種映射關(guān)系

在關(guān)系數(shù)據(jù)庫中, 有表與表存在下面幾種關(guān)系

多對一關(guān)系(Many-to-One)

一對一關(guān)系(One-to-One)

一對多關(guān)系(One-to-Many)

多對多關(guān)系(Many-to-Many)

也對應(yīng)這JPA中四種映射關(guān)系.

單值串聯(lián)

從一個(gè)實(shí)體實(shí)例關(guān)聯(lián)到另一個(gè)實(shí)體實(shí)例上, 其中目標(biāo)基數(shù)為1, 成為單值關(guān)聯(lián)(single-valued association).
多對一關(guān)系和一對一關(guān)系都是屬于這一類, 因?yàn)樵磳?shí)體至多引用了一個(gè)目標(biāo)實(shí)體.

多對一關(guān)聯(lián)(ManyToOne)

來看這么一個(gè)關(guān)系, 員工(employee)和部門(department)之間的關(guān)系, 顯然一個(gè)員工只能屬于一個(gè)部門, 而一個(gè)部門
內(nèi)當(dāng)然擁有多個(gè)員工, 所以從員工到部門的映射關(guān)系是多對一關(guān)系.

employee實(shí)體類

@Entity
public class Employee {
    @Id
    private Integer id;
    private String name;
    private Long salary;

    @ManyToOne
    private Department department;

    public Employee() {
    }

    public Employee(Integer id) {
        this.id = id;
    }
}

department實(shí)體類

@Data
@Entity
public class Department {
    @Id
    private Integer id;

    private String name;

}

程序運(yùn)行后, jpa創(chuàng)建表的sql語句如下

+------------+--------------------------------------+
| Table      | Create Table                         |
+------------+--------------------------------------+
| department | CREATE TABLE `department` (          |
|            |   `id` int(11) NOT NULL,             |
|            |   `name` varchar(255) DEFAULT NULL,  |
|            |   PRIMARY KEY (`id`)                 |
|            | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------+--------------------------------------+

+----------+---------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                            |
+----------+---------------------------------------------------------------------------------------------------------+
| employee | CREATE TABLE `employee` (                                                                               |
|          |   `id` int(11) NOT NULL,                                                                                |
|          |   `name` varchar(255) DEFAULT NULL,                                                                     |
|          |   `salary` bigint(20) DEFAULT NULL,                                                                     |
|          |   `department_id` int(11) DEFAULT NULL,                                                                 |
|          |   PRIMARY KEY (`id`),                                                                                   |
|          |   KEY `FKbejtwvg9bxus2mffsm3swj3u9` (`department_id`),                                                  |
|          |   CONSTRAINT `FKbejtwvg9bxus2mffsm3swj3u9` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`) |
|          | ) ENGINE=InnoDB DEFAULT CHARSET=utf8                                                                    |
+----------+---------------------------------------------------------------------------------------------------------+

department_id是jpa創(chuàng)建的外鍵, 如果想指定外鍵的名字, 可以通過@JoinColumn來聲明外鍵的名字

一對一映射

對于員工來說, 只有一個(gè)停車位(PackingSpace), 所以員工對停車位來說是一對一映射關(guān)系
修改EMPLOYEE類

@Data
@Entity
public class Employee {
    @Id
    private Integer id;
    private String name;
    private Long salary;

    @ManyToOne
    @JoinColumn(name = "dept_id")
    private Department department;

    @OneToOne
    @JoinColumn(name = "p_space_id")
    private ParkingSpace parkingSpace;

    public Employee() {
    }

    public Employee(Integer id) {
        this.id = id;
    }
}

創(chuàng)建PackingSpace實(shí)體類

@Data
@Entity
public class ParkingSpace {
    @Id
    private Integer id;

    private String location;
}

查看parking_space表和employee表

+---------------+-----------------------------------------+
| Table         | Create Table                            |
+---------------+-----------------------------------------+
| parking_space | CREATE TABLE `parking_space` (          |
|               |   `id` int(11) NOT NULL,                |
|               |   `location` varchar(255) DEFAULT NULL, |
|               |   PRIMARY KEY (`id`)                    |
|               | ) ENGINE=InnoDB DEFAULT CHARSET=utf8    |
+---------------+-----------------------------------------+
+----------+---------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                            |
+----------+---------------------------------------------------------------------------------------------------------+
| employee | CREATE TABLE `employee` (                                                                               |
|          |   `id` int(11) NOT NULL,                                                                                |
|          |   `name` varchar(255) DEFAULT NULL,                                                                     |
|          |   `salary` bigint(20) DEFAULT NULL,                                                                     |
|          |   `dept_id` int(11) DEFAULT NULL,                                                                       |
|          |   `p_space_id` int(11) DEFAULT NULL,                                                                    |
|          |   PRIMARY KEY (`id`),                                                                                   |
|          |   KEY `FKaqchbcb8i6nvtl9g6c72yba0p` (`dept_id`),                                                        |
|          |   KEY `FKd383146ko181lfhm1xuy3arci` (`p_space_id`),                                                     |
|          |   CONSTRAINT `FKaqchbcb8i6nvtl9g6c72yba0p` FOREIGN KEY (`dept_id`) REFERENCES `department` (`id`),      |
|          |   CONSTRAINT `FKd383146ko181lfhm1xuy3arci` FOREIGN KEY (`p_space_id`) REFERENCES `parking_space` (`id`) |
|          | ) ENGINE=InnoDB DEFAULT CHARSET=utf8                                                                    |
+----------+---------------------------------------------------------------------------------------------------------+
雙向一對一映射

對于員工來說, 至多只能擁有一個(gè)停車位, 對于停車位來說, 也至多只能屬于一個(gè)員工, 所以兩個(gè)方向都是一對一關(guān)系, 這被稱為雙向一對一關(guān)系

修改ParkingSpace實(shí)體類

@Data
@Entity
public class ParkingSpace {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String location;

    @OneToOne(mappedBy = "parkingSpace")
    @JoinColumn(name = "emp_id")
    private Employee employee;

    @Override
    public String toString() {
        return "ParkingSpace{" +
                "id=" + id +
                ", location="" + location + """ +
                "}";
    }
}

在雙向一對一關(guān)系中, 如果雙方都有mapperBy, name這樣是不合法, 如果雙方都沒有mapperBy, 這樣是不正確的, 因?yàn)槿绻p方都沒有mapperBy,
則當(dāng)前不是雙向一對一關(guān)系, 而是兩個(gè)單向的一對一關(guān)系.

集合值關(guān)聯(lián)

當(dāng)源實(shí)體引用一個(gè)或者多個(gè)目標(biāo)實(shí)體實(shí)例時(shí), 將使用一個(gè)多值關(guān)聯(lián)(many-valued association). 一對多關(guān)聯(lián)和多對多映射都符合

一對多映射

前面對于員工來說, 對于部門是多對一映射, 多個(gè)員工屬于一個(gè)部門, 相反的, 對于部門來說, 對員工是一對多的映射, 對于一個(gè)部門來說, 擁有多個(gè)員工,
所以也是雙向的關(guān)系

修改department實(shí)體類

@Data
@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

   @OneToMany(mappedBy = "department")
    private List employees;
}
多對多映射

員工與項(xiàng)目的關(guān)系也是多對多的關(guān)系, 一個(gè)員工大概率不會只會做一個(gè)項(xiàng)目, 一個(gè)項(xiàng)目大概率也不會只交給一個(gè)員工做

增加項(xiàng)目實(shí)體類

@Data
@Entity
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

    @ManyToMany(mappedBy = "projects")
    private List employees;
}

在員工實(shí)體類中添加如下

    @ManyToMany
    private List projects;

查看創(chuàng)建的表

+---------------------+
| Tables_in_db_projpa |
+---------------------+
| department          |
| employee            |
| employee_projects   |
| hibernate_sequence  |
| parking_space       |
| project             |
+---------------------+

可以看到除了創(chuàng)建project表外, 還創(chuàng)建了表employee_projects表, 沒有對這個(gè)連接表進(jìn)行配置, 是根據(jù)jpa默認(rèn)規(guī)則進(jìn)行創(chuàng)建的, 創(chuàng)表的sql語句為

+-------------------+-------------------------------------------------------------------------------------------------------+
| Table             | Create Table                                                                                          |
+-------------------+-------------------------------------------------------------------------------------------------------+
| employee_projects | CREATE TABLE `employee_projects` (                                                                    |
|                   |   `employees_id` int(11) NOT NULL,                                                                    |
|                   |   `projects_id` int(11) NOT NULL,                                                                     |
|                   |   KEY `FKg10a7uho2lylw8g080l5j4gyk` (`projects_id`),                                                  |
|                   |   KEY `FK88mdj5vmp7md19u4cbq154dk6` (`employees_id`),                                                 |
|                   |   CONSTRAINT `FK88mdj5vmp7md19u4cbq154dk6` FOREIGN KEY (`employees_id`) REFERENCES `employee` (`id`), |
|                   |   CONSTRAINT `FKg10a7uho2lylw8g080l5j4gyk` FOREIGN KEY (`projects_id`) REFERENCES `project` (`id`)    |
|                   | ) ENGINE=InnoDB DEFAULT CHARSET=utf8                                                                  |
+-------------------+-------------------------------------------------------------------------------------------------------+
使用@JoinTable來配置連接表

修改員工實(shí)體類, 添加@JoinTable注解

    @ManyToMany
    @JoinTable(name = "emp_proj", joinColumns = @JoinColumn(name = "emp_id"), inverseJoinColumns = @JoinColumn(name = "proj_id"))
    private List projects;

可以看到表名和字段名都相應(yīng)變化了

+----------+-------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                    |
+----------+-------------------------------------------------------------------------------------------------+
| emp_proj | CREATE TABLE `emp_proj` (                                                                       |
|          |   `emp_id` int(11) NOT NULL,                                                                    |
|          |   `proj_id` int(11) NOT NULL,                                                                   |
|          |   KEY `FKj350n5wr8yyesit27cw0agpjq` (`proj_id`),                                                |
|          |   KEY `FK10tf71i5h7os8kdrpm2k97gn2` (`emp_id`),                                                 |
|          |   CONSTRAINT `FK10tf71i5h7os8kdrpm2k97gn2` FOREIGN KEY (`emp_id`) REFERENCES `employee` (`id`), |
|          |   CONSTRAINT `FKj350n5wr8yyesit27cw0agpjq` FOREIGN KEY (`proj_id`) REFERENCES `project` (`id`)  |
|          | ) ENGINE=InnoDB DEFAULT CHARSET=utf8                                                            |
+----------+-------------------------------------------------------------------------------------------------+
參考資料

Pro JPA 2: 精通Java持久化API

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

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

相關(guān)文章

  • Spring Data JPA關(guān)系映射@OneToOne

    摘要:表示一對一的映射關(guān)系,比如一個(gè)賬號對應(yīng)一個(gè)用戶,一個(gè)實(shí)體用來描述賬號的信息賬號,密碼,賬號是否可用,賬號對應(yīng)的角色等,另外一個(gè)實(shí)體用來描述用戶的信息昵稱,年齡,性別,國籍等。這里貼出源碼,一個(gè)關(guān)系映射的小例子原創(chuàng)不易,感謝支持。 @OneToOne, 表示一對一的映射關(guān)系,比如一個(gè)賬號對應(yīng)一個(gè)用戶,一個(gè)實(shí)體用來描述賬號的信息(賬號,密碼,賬號是否可用,賬號對應(yīng)的角色等),另外一個(gè)實(shí)體用...

    zhangke3016 評論0 收藏0
  • 如何借助 NoSQL 提高 JPA 應(yīng)用性能

    摘要:當(dāng)時(shí),還飽受微軟和太陽間的訴訟的影響,該訴訟涉及到和間的兼容性。開發(fā)者們都在討論哪個(gè)平臺或者框架能夠勝出還是微軟新發(fā)布的。能為您提供端到端的應(yīng)用性能解決方案,我們支持所有常見的框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因。 【編者按】關(guān)注 NoSQL 的動(dòng)態(tài)發(fā)展很重要。NoSQL 的好處并不僅限于新的應(yīng)用開發(fā)。在某些案例中,你可以見識到重新訪問現(xiàn)有的、傳統(tǒng)的框架帶來的積極效...

    Airy 評論0 收藏0
  • String Data JPA 學(xué)習(xí)筆記

    摘要:說明首先來說是一個(gè)持久化規(guī)范,也就是說當(dāng)我們用的時(shí)候我們不需要去選面向的編程了,這樣就大大降低了偶和度了引入是一種規(guī)范,那么它的編程有哪些要求呢引入下載的包導(dǎo)入文件夾,然后我們的在下面加上一個(gè)目錄在該文件夾下面加上一個(gè)文件,這個(gè)文件的規(guī)范 說明 首先來說JPA是一個(gè)持久化規(guī)范,也就是說當(dāng)我們用jpa的時(shí)候我們不需要去選面向hibernate的api編程了,這樣就大大降低了偶和度了 引入...

    Java_oldboy 評論0 收藏0

發(fā)表評論

0條評論

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