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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM