JPA Map映射

Map是一個接口,其中一個唯一鍵與每個值對象相關聯。 因此,搜索,更新,刪除等操作都是基於鍵來進行的。

完整的項目目錄結構如下所示 -
JPA Map映射

集合映射實例

在這個例子中,我們將一個對象嵌入到一個實體類中,並將其定義爲一個集合類型 - Map

private Map<Integer,Address> map=new HashMap<Integer,Address>();

這個例子包含以下步驟 -

第1步:com.yiibai.jpa包下創建一個實體類Employee.java,這個類包含員工idname 和嵌入對象(員工地址)。註解 [@ElementCollection](https://github.com/ElementCollection "@ElementCollection") 表示嵌入對象。

文件:Employee.java 的代碼如下所示 -

package com.yiibai.jpa;

import java.util.*;

import javax.persistence.*;

@Entity

public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int e_id;
    private String e_name;

    @ElementCollection
    private Map<Integer, Address> map = new HashMap<Integer, Address>();

    public int getE_id() {
        return e_id;
    }

    public void setE_id(int e_id) {
        this.e_id = e_id;
    }

    public String getE_name() {
        return e_name;
    }

    public void setE_name(String e_name) {
        this.e_name = e_name;
    }

    public Map<Integer, Address> getMap() {
        return map;
    }

    public void setMap(Map<Integer, Address> map) {
        this.map = map;
    }

}

第2步:com.yiibai.jpa包下創建一個嵌入對象Address.java類。 註解[@Embeddable](https://github.com/Embeddable "@Embeddable")表示可嵌入對象。

文件:Address.java 的代碼如下所示 -

package com.yiibai.jpa;

import javax.persistence.*;

@Embeddable
public class Address {

    private int e_pincode;
    private String e_city;
    private String e_state;

    public int getE_pincode() {
        return e_pincode;
    }

    public void setE_pincode(int e_pincode) {
        this.e_pincode = e_pincode;
    }

    public String getE_city() {
        return e_city;
    }

    public void setE_city(String e_city) {
        this.e_city = e_city;
    }

    public String getE_state() {
        return e_state;
    }

    public void setE_state(String e_state) {
        this.e_state = e_state;
    }

}

第3步: 將實體類和其他數據庫配置映射到persistence.xml文件中。

文件:persistence.xml 的代碼如下所示 -

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="Collection_Type">
        <class>com.yiibai.jpa.Employee</class>
        <class>com.yiibai.jpa.Address</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password"
                value="123456" />
            <property name="eclipselink.logging.level" value="SEVERE" />
            <property name="eclipselink.ddl-generation"
                value="create-or-extend-tables" />
        </properties>
    </persistence-unit>

</persistence>

com.yiibai.collection包下創建一個持久化類MapMapping.java,以便將實體對象與數據保持一致。

文件:MapMapping.java 的代碼如下所示 -

package com.yiibai.collection;

import javax.persistence.*;

import com.yiibai.jpa.*;

public class MapMapping {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Collection_Type");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        Address a1 = new Address();
        a1.setE_pincode(511000);
        a1.setE_city("Guangzhou");
        a1.setE_state("Guangdong");

        Address a2 = new Address();
        a2.setE_pincode(202001);
        a2.setE_city("Nanjing");
        a2.setE_state("Jiangsu");

        Address a3 = new Address();
        a3.setE_pincode(333301);
        a3.setE_city("Chengdu");
        a3.setE_state("Shichuan");

        Address a4 = new Address();
        a4.setE_pincode(80001);
        a4.setE_city("Haikou");
        a4.setE_state("Hainan");

        Employee e1 = new Employee();
        e1.setE_id(1);
        e1.setE_name("Maxsu");

        Employee e2 = new Employee();
        e2.setE_id(2);
        e2.setE_name("Leeze");

        Employee e3 = new Employee();
        e3.setE_id(3);
        e3.setE_name("William");

        Employee e4 = new Employee();
        e4.setE_id(4);
        e4.setE_name("Curry");

        e1.getMap().put(1, a1);
        e2.getMap().put(2, a2);
        e3.getMap().put(3, a3);
        e4.getMap().put(4, a4);

        em.persist(e1);
        em.persist(e2);
        em.persist(e3);
        em.persist(e4);

        em.getTransaction().commit();

        em.close();
        emf.close();

    }

}

程序輸出結果

程序執行完成後,下面的表格在MySQL工作臺下生成。

  • Employee表 - 此表包含員工詳細信息。要獲取數據,請在MySQL中運行select * from employee查詢。結果如下所示 -
mysql> select * from employee;
+------+---------+
| E_ID | E_NAME  |
+------+---------+
|    2 | Leeze   |
|    3 | William |
|    4 | Curry   |
|    1 | Maxsu   |
+------+---------+
4 rows in set
  • employee_address表 - 此表表示員工和地址表之間的映射。 要獲取數據,請在MySQL中運行select * from employee_address查詢。結果如下所示 -
mysql> select * from employee_address;
+-----------+-----------+-----------+---------------+
| E_CITY    | E_PINCODE | E_STATE   | Employee_E_ID |
+-----------+-----------+-----------+---------------+
| Hangzhou  |    533300 | Zhejiang  |          1003 |
| Nanjing   |    780000 | Jiangsu   |          1004 |
| Guangzhou |    501000 | GuangDong |          1000 |
| Haikou    |    571100 | Hainan    |          1002 |
+-----------+-----------+-----------+---------------+
4 rows in set