有两种方法来map composite key. 第一种用@IdClass第二种用@Embeddable,参考链接: http://stackoverflow.com/questions/3585034/how-to-map-a-composite-key-with-hibernate

一. @IdClass方法

1. Bean

package locationService.beans;

import java.io.Serializable;

import javax.persistence.*;

@Entity
@Table(name = "entity_to_entity")
@IdClass(EntityToEntityPk.class)
public class EntityToEntity implements Serializable { private static final long serialVersionUID = 11L;
private int parentId;
private int childId; @Id
@Column(name="parent_id")
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
} @Id
@Column(name="child_id")
public int getChildId() {
return childId;
}
public void setChildId(int childId) {
this.childId = childId;
} @Override
public String toString() {
return "parentId is " + parentId + ", childId is " + childId;
} } class EntityToEntityPk implements Serializable {
private static final long serialVersionUID = 12L;
protected Integer parentId;
protected Integer childId; public EntityToEntityPk() {} public EntityToEntityPk(Integer parentId, Integer childId) {
this.parentId = parentId;
this.childId = childId;
} public Integer getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
} public Integer getChildId() {
return childId;
}
public void setChildId(int childId) {
this.childId = childId;
} @Override
public boolean equals(Object o) {
if(o instanceof EntityToEntityPk){
EntityToEntityPk other = (EntityToEntityPk) o;
return parentId.equals(other.getParentId()) && childId.equals(other.getChildId());
} return false;
} @Override
public int hashCode() {
return parentId.hashCode() + childId.hashCode();
} }

  

注意equals和hasCode方法是composite key必须要有的

A composite id must implement both methods or the id will not work properly. Hibernate must be able to compare ids. A composite id will most likely use all its id fields in the equals and hashCode methods.

An entity does not need to implement equals and hashCode under some conditions. The persistence context guaranties that an entity with a given id exists only once. You cannot let two objects with the same id become persistent. Assuming that a class Country uses the isocode as ID, the following code will cause a non unique object exception.

参考链接: http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html

2. Unit Test

  @Test
public void testEnityToEntity() {
Session session = Config.getSessionFactory().openSession();
session.beginTransaction(); Query query = session.createQuery("select t.parentId from EntityToEntity t"); @SuppressWarnings("unchecked")
List<Object> entities = query.list();
assertEquals(entities.get(0), 1); session.getTransaction().commit();
session.close();
}

Hibernate composite key的更多相关文章

  1. [转]Support Composite Key in ASP.NET Web API OData

    本文转自:https://code.msdn.microsoft.com/Support-Composite-Key-in-d1d53161 he default EntitySetControlle ...

  2. hibernate映射文件set key one-to-many

    转自:https://www.linuxidc.com/Linux/2013-11/92228.htm 1 hibernate映射文件set key one-to-many的配置. POJOs如下: ...

  3. HIBERNATE - 符合Java习惯的关系数据库持久化(精华篇)

    HIBERNATE - 符合Java习惯的关系数据库持久化      下一页 HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.0.4   目录 前言 1. ...

  4. eclipse中hibernate和mybatis中xml配置文件的没有标签提醒解决方法

    当我们使用eclipse编写Mybatis或hibernate的xml文件时,面对众多标签的配置文件,却没有自动提醒,对于工作和学习都十分不方便. 之所以没有自动提醒,是因为dtd文件没有加载成功. ...

  5. hibernate学习(一)配置,导包

    框架的作用 学过javaWeb基础的已经对web层 jsp  servlet   ,service  层  ,dao层的jdbc .DBUtils 有了很深的了解 并编写代码实现某种功能 为了提高开发 ...

  6. 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法

    1. 持久化实体 Serializable save(Object obj) : 将obj对象变为持久化状态,该对象的属性将被保存到数据库. void persist(Object obj) : 将o ...

  7. Hibernate的dtd文件和properties文件

    hibernate-configuration-3.0.dtd <!-- Hibernate file-based configuration document. <!DOCTYPE hi ...

  8. 关于Hibernate的Dialect

    org.hibernate HibernateException Dialect must be explicitly set :***  使用Hibernate,有时候会遇到类似上面的异常.  使用 ...

  9. Hibernate的集合映射(Set、List、Array、Map、Bag)

    POJOs如下: Customer类------>customer表   Order类对应---------->orders表  customer(1)<-------------- ...

随机推荐

  1. GNU/Linux与开源文化的那些人和事

     一.计算机的发明 世上本无路,走的人多了,就有了路.世上本无计算机,琢磨的人多了--没有计算机,一切无从谈起. 三个人对计算机的发明功不可没,居功至伟.阿兰·图灵(Alan Mathison Tur ...

  2. zookeeper的安装与部署-伪集群

    1.Zookeeper的下载与解压     通过后面的链接下载Zookeeper:    Zookeeper下载在此我们下载zookeeper-3.4.5下载后解压至安装目录下,本文我们解压到目录:/ ...

  3. Excel图表-创意雷达图-原创图表

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  4. java 基础知识四 流程控制

    java   基础知识四 流程控制 Java流程控制包括顺序控制.条件控制和循环控制 顺序控制就是逐条执行 有if和switch两个分支 循环控制就是 又称为回路控制,根据循环初始条件和终结要求,执行 ...

  5. jQuery的发展史

    jQuery的发展史,你知道吗? 每天多学一点知识,就少写一行代码2006年1月,jQuery的第一个版本面世,至今已经有6年多了(注:这个时间点是截止至出书时间).虽然过了这么久,但它依然以其简洁. ...

  6. JS中的函数、Bom、DOM及JS事件

    本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...

  7. canvas绘制一定数目的圆(均分)

    绘制多圆 2016年5月24日12:12:26 绘制一定数目(num)颜色随机的小圆,围成一个大圆.根据num完全自动生成,且小圆自动均分大圆路径(num≥20). 效果: 前置技能:(1).Canv ...

  8. 转载---关于Spring的69个面试问答

    链接:http://www.importnew.com/11657.html 目录 Spring概述 依赖注入 Spring Beans Spring注解 Spring的对象访问 Spring面向切面 ...

  9. ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist

    Oracle 设置默认数据库 如果我们的服务器上或者电脑上安装了多个数据库,当我们使用sqlplus时如果为指定数据库时登录到的是哪一个数据库呢?今天遇到了一个老问题: ORA-01034: ORAC ...

  10. 【lucene系列学习四】使用IKAnalyzer分词器实现敏感词和停用词过滤

    Lucene自带的中文分词器SmartChineseAnalyzer不太好扩展,于是我用了IKAnalyzer来进行敏感词和停用词的过滤. 首先,下载IKAnalyzer,我下载了 然后,由于IKAn ...