JPA 系列教程21-JPA2.0-@MapKeyColumn
@MapKeyColumn
用@JoinColumn注解和@MapKeyColumn处理一对多关系
ddl语句
CREATE TABLE `t_employee` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `t_employee_map` (
  `Employee_id` bigint(20) NOT NULL,
  `emp_value` varchar(255) DEFAULT NULL,
  `emp_key` varchar(255) NOT NULL,
  PRIMARY KEY (`Employee_id`,`emp_key`),
  CONSTRAINT `FK_k06nikcsc4pc9oasboix6uagw` FOREIGN KEY (`Employee_id`) REFERENCES `t_employee` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Employee
package com.jege.jpa;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;
/**
 * @author JE哥
 * @email 1272434821@qq.com
 * @description:pojo模型
 */
@Entity
@Table(name = "t_employee")
public class Employee {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  @ElementCollection
  // 生成的表的主键Map.key+EmployeeMap_id
  @CollectionTable(name = "t_employee_map")
  @MapKeyColumn(name = "emp_key")
  @Column(name = "emp_value")
  private Map<String, String> others = new HashMap<String, String>();
  public Employee() {
  }
  public Employee(String name) {
    this.name = name;
  }
  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Map<String, String> getOthers() {
    return others;
  }
  public void setOthers(Map<String, String> others) {
    this.others = others;
  }
}
JPA2Test
package com.jege.jpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class JPA2Test {
  private static EntityManagerFactory entityManagerFactory = null;
  private EntityManager entityManager = null;
  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
  }
  @Before
  public void setUp() throws Exception {
    entityManager = entityManagerFactory.createEntityManager();// Session
  }
  @Test
  public void persist() throws Exception {
    Employee employee = new Employee();
    employee.setName("je-ge");
    employee.getOthers().put("home", "beijing");
    employee.getOthers().put("work", "shanghai");
    entityManager.getTransaction().begin();
    entityManager.persist(employee);
    entityManager.getTransaction().commit();
  }
  @Test
  public void find() throws Exception {
    persist();
    entityManager.clear();
    Employee employee = entityManager.find(Employee.class, 1L);
    System.out.println(employee.getName());
    System.out.println(employee.getOthers());
  }
  @After
  public void tearDown() throws Exception {
    if (entityManager != null && entityManager.isOpen())
      entityManager.close();
  }
  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    if (entityManagerFactory != null && entityManagerFactory.isOpen())
      entityManagerFactory.close();
  }
}
其他关联项目
- JPA 系列教程20-JPA2.0-@CollectionTable 
http://blog.csdn.net/je_ge/article/details/53998548 
源码地址
如果觉得我的文章或者代码对您有帮助,可以请我喝杯咖啡。您的支持将鼓励我继续创作!谢谢! 
 
JPA 系列教程21-JPA2.0-@MapKeyColumn的更多相关文章
- JPA 系列教程13-复合主键-@EmbeddedId+@Embeddable
		
复合主键 指多个主键联合形成一个主键组合 需求产生 比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示 ddl语句 同复合主键-2个@Id和复合主键-2个@Id+ ...
 - JPA 系列教程12-复合主键-2个@Id+@IdClass
		
复合主键 指多个主键联合形成一个主键组合 需求产生 比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示 ddl语句 同复合主键-2个@Id一样 Airline p ...
 - JPA 系列教程5-双向一对多
		
双向一对多的ddl语句 同单向多对一,单向一对多表的ddl语句一致 Product package com.jege.jpa.one2many; import javax.persistence.En ...
 - JPA 系列教程4-单向一对多
		
JPA中的@OneToMany @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface OneToMany { Class tar ...
 - JPA 系列教程17-继承-独立表-TABLE_PER_CLASS
		
PerTable策略 每个具体的类一个表的策略 举例 这种映射策略每个类都会映射成一个单独的表,类的所有属性,包括继承的属性都会映射成表的列. 这种映射策略的缺点是:对多态关系的支持有限,当查询涉及到 ...
 - JPA 系列教程16-继承-联合子类-JOINED
		
联合子类策略 这种情况下子类的字段被映射到各自的表中,这些字段包括父类中的字段,并执行一个join操作来实例化子类. 举例 如果实体类Teacher继承实体类Person,实体类Student也继承自 ...
 - JPA 系列教程10-双向一对一关联表
		
双向一对一关联表的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255 ...
 - JPA 系列教程9-双向一对一唯一外键
		
双向一对一唯一外键的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(25 ...
 - JPA 系列教程7-双向多对多
		
双向多对多的ddl语句 同单向多对多表的ddl语句一致 Student package com.jege.jpa.many2many; import java.util.HashSet; import ...
 
随机推荐
- java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent
			
07-24 09:58:23.239: E/AndroidRuntime(29487): FATAL EXCEPTION: main 07-24 09:58:23.239: E/AndroidRunt ...
 - SharePoint Solutions Deployment-PowerShell
			
之前群里有人问到了这个,项目一期开发结束后正好整理了一下,发上来分享一下,也是从谷歌搜索里面学来的,大家要用好搜索哈 $ver = $host | select version if ($ver.Ve ...
 - 机器学习实战kNN之手写识别
			
kNN算法算是机器学习入门级绝佳的素材.书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系.输入没有标签的新数据 ...
 - spring请求到达controller但响应404
			
问题是这样的,前台发送请求的后台,后台的方法正常执行,将数据放在response.getWrite里,但在前台并没有展示数据.用浏览器的开发者工具看下请求,发现响应404. 最后网上查了查,sprin ...
 - 解决浏览器兼容问题的css hack
			
原理 由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系.我们就可以根据这个来针对不同的浏览器来写不同的CSS.CSS Hack大致有3种表现形式,CSS类内部Hack.选择 ...
 - jsp-2 简单的servlet连接mysql数据库 增删改查
			
连接mysql数据库的操作 有增删改查 用的包有 commons-lang3-3.5 mysql-connector-java-5.1.40-bin 但是实际上也就是 数据查询和数据处理两种 所以对数 ...
 - 【Java每日一题】20170113
			
20170112问题解析请点击今日问题下方的"[Java每日一题]20170113"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
 - 数娱科技:借助VR技术可让你了解自己的大脑
			
你可能很好奇自己的大脑,如果你是一个脑部病患,可能更想了解下自己的大脑.好消息是,脑机接口让这个想法成为可能. 在上周六,AR/VR科技公司广州数娱科技发布了联合5家单位共同研发的"VR人脑 ...
 - [Usaco 再次除草]
			
以后都用自己的号交吧 免得掉人品 Noip2016就是一个见证 一步一个脚印的刷 noip没把前两题稳拿就刷牛头.. bzoj1230 线段树打翻转标记,练手感 bzoj1231 状态压缩 预处理 ...
 - OSI模型第二层数据链路层-STP协议
			
1.stp协议的由来. 在二层网络中,交换机起到了很重要的作用,如果有一台交换机出现故障会影响网络的使用,为了避免存在单点故障,在实际的二层链路中会采用链路冗余,也就是采用交换设备之间多条联络连接,即 ...