组合主键及JPA映射

组合主键

主键最常见的是单字段主键,组合主键使用两个及以上的字段作为主键,常用于多个字段能唯一标示一条记录的表。比如,股票数据表,股票代码、日期和收盘价作为主键。每支股票,在一个特定日期,只能有一个收盘价。

数据库管理系统使用MySQL,创建一个具有组合主键的表Person。

CREATE TABLE PERSON (
	name VARCHAR(255) NOT NULL,
    age BIGINT UNSIGNED NOT NULL,
    adress VARCHAR(255) ,
	PRIMARY KEY (name, age)
) ENGINE = InnoDB;

JPA映射之@IdClass

定义工具类

package com.gxz.entities;

import java.io.Serializable;

public class PersonCompositeId implements Serializable {
	private String name;
    private long age;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getAge() {
		return age;
	}
	public void setAge(long age) {
		this.age = age;
	}
}

该工具类的属性必须和实体类的@Id属性完全匹配。包括数量、名字,不能有额外的属性。

定义实体类

package com.gxz.entities;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;

@Entity
@Table
@IdClass(PersonCompositeId.class)
public class Person {
	private String name;
    private long age;
    private String adress;

    @Id
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Id
	public long getAge() {
		return age;
	}

	public void setAge(long age) {
		this.age = age;
	}

	public String getAdress() {
		return adress;
	}
	public void setAdress(String adress) {
		this.adress = adress;
	}
}

该实体类有两个属性标示为@Id,表示主键为组合主键,主键属性为name、age。相应地,工具类PersonCompositeId必须有两个属性,分别为name、age。注意,此处指的是工具类必须有getName、setName、getAge、setAge,而不是指必须有字段name、age,注意区分属性和字段的区别。@IdClass(PersonCompositeId.class):表示使用工具类PersonCompositeId定义组合主键。另外,工具类PersonCompositeId必须实现序列化Serializable,否则,报出如下异常。

[PersistenceUnit: EntityMappings] Unable to build Hibernate SessionFactory
Composite-id class must implement Serializable: com.gxz.entities.PersonCompositeId
Composite-id class must implement Serializable: com.gxz.entities.PersonCompositeId

持久化

 Person person = new Person();
            person.setName("李四");
            person.setAge(40);
            person.setAdress("广州市");
            manager.persist(person);

根据id查找实体

 PersonCompositeId personCompositeId = new PersonCompositeId();
            personCompositeId.setName("张三");
            personCompositeId.setAge(50);
            Person person = manager.find(Person.class, personCompositeId);
            if (person != null) {
            	System.out.println("name:" + person.getName() + " age:" + person.getAge());
			}

JPA映射之@EmbeddedId

定义工具类

package com.gxz.entities;

import java.io.Serializable;

import javax.persistence.Embeddable;

@Embeddable
public class PersonCompositeId implements Serializable {
	private String name;
    private long age;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getAge() {
		return age;
	}
	public void setAge(long age) {
		this.age = age;
	}
}

@Embeddable:表示该工具类用于组合主键,属性就是组合主键的属性。

定义实体类

package com.gxz.entities;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table
public class Person {
	private PersonCompositeId personCompositeId;

	@EmbeddedId
    public PersonCompositeId getPersonCompositeId() {
		return personCompositeId;
	}
	public void setPersonCompositeId(PersonCompositeId personCompositeId) {
		this.personCompositeId = personCompositeId;
	}
	private String adress;

	public String getAdress() {
		return adress;
	}
	public void setAdress(String adress) {
		this.adress = adress;
	}
}

@EmbeddedId:表示该属性是组合主键,类型是组合主键工具类。

持久化

PersonCompositeId personCompositeId = new PersonCompositeId();
            personCompositeId.setName("搜噶");
            personCompositeId.setAge(100);
            person.setPersonCompositeId(personCompositeId);

            person.setAdress("广州市");
            manager.persist(person);

            transaction.commit();

两种映射方式的比较

第一种方式,工具类和实体类有一模一样的属性,属于冗余,第二种方式则没有没有冗余,显得更加科学。因此,实际工作中,第二种方式更加常用。

时间: 2024-10-25 23:39:31

组合主键及JPA映射的相关文章

主键,组合主键,聚集索引,非聚集索引,唯一索引

前言: 基于Oracle数据库谈谈索引们的问题,以及在什么情况下使用什么索引, 组合主键,怎么根据实际业务需求来定制自己的索引,主键的应用,来提升系统的性能. 1:主键? 在表中唯一的,也是聚集索引.作用于快速查询.该列唯一. Java代码 复制代码 收藏代码 1.ID NUMBER(38,0) PRIMARY KEY NOT NULL, 2:组合主键? 在表中以多个字段组成在表中是唯一的,也是聚集索引.作用于快速查询.该组合列唯一. Java代码 复制代码 收藏代码 1.CREATE TABL

hibernate 联合主键生成机制(组合主键XML配置方式)

hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hi

Entity Framework 无法对没有主键的视图映射实体的解决办法

我们在使用Entity Framework的时候经常会把数据库中的某一个视图映射为EF的实体,但是如果数据库视图中的列没有包含表的主键列,EF会报出警告说视图没有主键,导致映射为实体失败错误如下: 表/视图“{0}”未定义主键,无法推断有效的主键.已排除该表/视图.要使用该实体,您将需要检查架构,添加正确的键并对它取消注释. English translation: The table/view '{0}' does not have a primary key defined and no v

MySQL主键自动生成和生成器表以及JPA主键映射

MySQL主键自动生成 表设计 MySQL有许多主键生成策略,其中很常见的一种是自动生成.一般情况下,主键类型是BIGINT UNSIGNED,自动生成主键的关键词是AUTO_INCREMENT. CREATE TABLE Stock ( id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, NO VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, price DECIMAL(6,2) N

Oracle序列和主键映射

前言 每张表都有主键,可分别简单主键和组合主键,简单主键为表中的一列,组合主键为表中的几列.主键的生成策略有许多种,其中,序列是oracle常见的主键生成策略之一.本文主要讲解JPA映射主键的技术细节.其中,主键生成策略是oracle序列,JPA实现是Hibernate. oracle序列 创建序列 drop sequence testsequence; Create sequence testsequence Increment by 1 Start with 1 NOMAXVALUE NOM

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输

hibernate笔记--基于主键的单(双)向的一对一映射关系

上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置: 新建一个IdCard实体类: public class IdCard { private int id; private String code; private Person p

[原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate 表映射 主键生成策略与复合主键

主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射  Hibernate封装了数据库DDL语句,只需要将数据表和类之间实现映射,即可对数据表进行操作. 示例:数据库中存在表interface_admin.ds_area,实现表和类之间映射,其中单一主键oggKeyId,使用主键自动生成策略UUID,具体第二点进行阐述 . package com.pec.model; import java.io.Seri