• JPA Map映射


    Map是一个接口,其中一个唯一键与每个值对象相关联。 因此,搜索,更新,删除等操作都是基于键来进行的。

    完整的项目目录结构如下所示 -

    集合映射实例

    在这个例子中,我们将一个对象嵌入到一个实体类中,并将其定义为一个集合类型 - Map

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

    这个例子包含以下步骤 -

    第1步:com.yiibai.jpa包下创建一个实体类Employee.java,这个类包含员工idname 和嵌入对象(员工地址)。注解 @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;
        }
    
    }
    
    Java

    第2步:com.yiibai.jpa包下创建一个嵌入对象Address.java类。 注解@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;
        }
    
    }
    
    Java

    第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>
    
    XML

    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();
    
        }
    
    }
    
    Java

    程序输出结果

    程序执行完成后,下面的表格在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
    
    Shell
    • 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
  • 相关阅读:
    0326系统按钮添加权限的工作(jsp权限写法)
    0321菜单数据
    ztree树的递归
    前端padding margin
    解决1像素边框问题
    水平垂直居中
    移动端css公共样式
    tap方法改良this指向
    移动端常见问题
    前端笔记(兼容)
  • 原文地址:https://www.cnblogs.com/borter/p/12423952.html
Copyright © 2020-2023  润新知