`

hibernate注解配置联合主键

阅读更多
有时一个实体的主键可能同时为多个,例如下面使用的字典“Dictionary”实体,需要通过dictId 、dictTypeid 和cityId 来查找指定实体,当且仅当dictId 、dictTypeid 和cityId 的值完全相同时,才认为是相同的实体对象。要配置这样的联合主键,步骤如以下所示。

(1)编写一个联合主键的类DictionaryPK,代码如下。

import java.io.Serializable;

import javax.persistence.Column;

/**
 * 字典表主键类(联合主键)
 * 
 * @author ahomeeye
 */
public class DictionaryPK implements Serializable {

	private static final long serialVersionUID = -1118337265519377063L;
	private String dictId; // 数据标识
	private String dictTypeid;// 数据类型标识
	private String cityId;// 所属本地网 默认0

	@Column(name = "DICT_ID")
	public String getDictId() {
		return dictId;
	}

	public void setDictId(String dictId) {
		this.dictId = dictId;
	}

	@Column(name = "DICT_TYPEID")
	public String getDictTypeid() {
		return dictTypeid;
	}

	public void setDictTypeid(String dictTypeid) {
		this.dictTypeid = dictTypeid;
	}

	@Column(name = "CITY_ID")
	public String getCityId() {
		return cityId;
	}

	public void setCityId(String cityId) {
		this.cityId = cityId;
	}

	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((dictId == null) ? 0 : dictId.hashCode());
		result = PRIME * result
				+ ((dictTypeid == null) ? 0 : dictTypeid.hashCode());
		result = PRIME * result + ((cityId == null) ? 0 : cityId.hashCode());
		return result;
	}

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;

		final DictionaryPK other = (DictionaryPK) obj;
		if (dictId == null) {
			if (other.dictId != null)
				return false;
		} else if (!dictId.equals(other.dictId))
			return false;

		if (dictTypeid == null) {
			if (other.dictTypeid != null)
				return false;
		} else if (!dictTypeid.equals(other.dictTypeid))
			return false;

		if (cityId == null) {
			if (other.cityId != null)
				return false;
		} else if (!cityId.equals(other.cityId))
			return false;

		return true;
	}

}


作为符合主键类,要满足以下几点要求:
1.必须实现Serializable接口。
2.必须有默认的public无参数的构造方法。
3.必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。本例中,只有对象的dictId 、dictTypeid 和cityId 值完全相同时或同一个对象时则返回true,否则返回false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。

(2)通过@IdClass注释在实体中标注联合主键,实体代码如下。
import java.io.Serializable;

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

/**
 * 系统字典数据
 * 
 * @author ahomeeye
 */
@Entity
@Table(name = "T_DICT")
@IdClass(DictionaryPK.class)
public class Dictionary implements Serializable {

	private static final long serialVersionUID = 1L;
	private String dictId; // 数据标识
	private String dictTypeid;// 数据类型标识
	private String dictName;// 数据名称
	private String dictStatus;// 数据状态
	private String dictDesc;// 数据描述
	private Integer dictOrder;// 序号
	private String cityId;// 所属本地网 默认0

	@Id
	@Column(name = "DICT_ID")
	public String getDictId() {
		return dictId;
	}

	public void setDictId(String dictId) {
		this.dictId = dictId;
	}

	@Id
	@Column(name = "DICT_TYPEID")
	public String getDictTypeid() {
		return dictTypeid;
	}

	public void setDictTypeid(String dictTypeid) {
		this.dictTypeid = dictTypeid;
	}

	@Column(name = "DICT_NAME")
	public String getDictName() {
		return dictName;
	}

	public void setDictName(String dictName) {
		this.dictName = dictName;
	}

	@Column(name = "DICT_STATUS")
	public String getDictStatus() {
		return dictStatus;
	}

	public void setDictStatus(String dictStatus) {
		this.dictStatus = dictStatus;
	}

	@Column(name = "DICT_DESC")
	public String getDictDesc() {
		return dictDesc;
	}

	public void setDictDesc(String dictDesc) {
		this.dictDesc = dictDesc;
	}

	@Column(name = "DICT_INDEX")
	public Integer getDictOrder() {
		return dictOrder;
	}

	public void setDictOrder(Integer dictOrder) {
		this.dictOrder = dictOrder;
	}

	@Id
	@Column(name = "CITY_ID")
	public String getCityId() {
		return cityId;
	}

	public void setCityId(String cityId) {
		this.cityId = cityId;
	}

}


标注联合主键时需要注意以下几个问题。

1.@IdClass标注用于标注实体所使用主键规则的类。它的定义如下所示。

@Target({TYPE}) @Retention(RUNTIME)

public @interface IdClass {

Class value();

}

2.属性Class表示联合主键所使用的类,本例中使用DictionaryPK 这个联合主键类。

3.在实体中同时标注主键的属性。本例中在dictId、dictTypeid 和cityId 的getter方法前标注@Id,表示联合主键使用这两个属性。

(3)这样定义实体的联合主键后,通过以下代码便可以获得指定的实体对象:
DictionaryPK cpk = new DictionaryPK ("asyncTree","OperLogFunc","0");
Dictionary instance = entityManager.find(DictionaryPK .class, cpk);


参考:
http://www.blogjava.net/relax/archive/2009/09/18/295587.html


分享到:
评论

相关推荐

    JPA注解实现联合主键

    ### JPA注解实现联合主键 在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架...

    Hibernate联合主键的例子

    在Hibernate中,我们可以使用`@Embeddable`和`@EmbeddedId`注解来定义和使用联合主键。 1. **创建联合主键类:** 在MyEclipse中,我们首先创建一个Java类来表示联合主键。这个类需要被标记为`@Embeddable`,并包含...

    hibernate复合主键配置和使用

    现在,大多数项目都使用注解配置,但如果你仍然需要处理旧的项目,这里是如何配置的示例: ```xml <hibernate-mapping> <!-- 其他属性 --> </hibernate-mapping> ``` 四、保存和查询带有复合主键的...

    Hibernate注解jar包

    本主题将深入探讨Hibernate注解的相关知识点。 1. **注解概述**: 注解(Annotations)是Java 5引入的一种元数据,它提供了在源代码中嵌入信息的方式,这些信息可以被编译器或者在运行时的Java虚拟机使用。在...

    hibernate注解详解说明

    Hibernate 提供了多种继承映射策略,如 `@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`、`@DiscriminatorColumn` 和 `@DiscriminatorValue`,以支持单表继承、子类表和联合主键等。 #### 映射关联关系 - ...

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    Hibernate教程08_关系映射之联合主键

    在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...

    hibernate复合主键的实例

    通过以上步骤,我们就成功地在Hibernate中配置了一个复合主键的实例。在实际开发中,根据具体需求调整实体和复合主键类的属性,以满足业务场景。 四、总结 复合主键在多字段标识的情况下非常有用,它可以保证数据...

    hibernate注解中英文版

    Hibernate注解是元数据的一种形式,它们允许我们在Java类和属性上直接声明关于如何映射到数据库的信息,避免了XML配置文件的繁琐。通过注解,我们可以指定实体类、属性、关联关系等如何对应到数据库表和字段。 二、...

    hibernate复合主键映射

    总结来说,Hibernate复合主键映射是处理多字段主键的关键技术,它通过`@Embeddable`和`@EmbeddedId`注解以及相应的XML配置,使开发者能够方便地管理和操作具有复合主键的实体。在开发过程中,正确理解和使用这项功能...

    Hibernate中对数据库复合主键的支持.pdf

    这可以通过在`hibernate.cfg.xml`或实体类的注解中定义主键策略来实现。以注解为例,可以使用`@EmbeddedId`注解来指定一个复合主键: ```java import javax.persistence.EmbeddedId; import javax.persistence....

    hibernate中文帮助文档

    Hibernate 是一个流行的对象...总的来说,这个中文帮助文档详尽地阐述了使用Hibernate注解进行数据库映射的各种细节,对于理解和使用Hibernate进行Java开发非常有帮助。无论是新手还是经验丰富的开发者,都能从中受益。

    Hibernate 系列教程 单向一对多

    在Hibernate中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,我们来看单向一对多关联的基本概念。在Java类中,我们将有一个“一”的类(如`Department`)和一个“多”的类(如`Employee`)。在`...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - 联合主键是多个字段共同构成的主键,可以通过@EmbeddedId和@Embeddable注解实现。 - 复合主键是自动生成的主键,通过@TableGenerator或@IdClass实现。 **8. 异常处理** - Hibernate提供了自己的异常体系,如...

    Hibernate_关联关系映射配置

    五、联合主键(Composite Key) 在某些情况下,实体的主键可能由两个或更多个字段组成。这时,我们需要使用`@EmbeddedId`和`@Embeddable`注解来定义复合主键类和其属性。`@EmbeddedId`用于指定实体的主键类,而`@...

    Hibernate3.2详细教程及课程笔记

    11. **联合主键**:当一个表的主键由两个或更多列组成时,需要使用联合主键来映射。 12. **继承映射**:Hibernate支持单表继承、联合继承和表格-per-class继承策略,学习者应了解每种策略的适用场景。 通过本教程...

    hibernate_annotations

    ### Hibernate 注解配置详解 #### 版本说明 文档中提到的版本为 3.2.0CR1,这是一个早期的版本,可能与当前最新的 Hibernate 版本存在一定的差异。尽管如此,其中介绍的基本概念和技术仍然具有参考价值。 #### ...

    hibernate 3.6 中文 chm

    3. **对象关系映射**:Hibernate的核心功能在于对象关系映射,它通过注解或XML配置将Java类与数据库表关联,实现对象的持久化。 4. **Session接口**:在Hibernate中,Session是与数据库交互的主要接口,负责保存、...

    hibernate各种常用关联关系的基本配置

    通常需要一个中间表来存储两个实体的联合主键。配置时使用`@ManyToMany`,并可通过`@JoinTable`定义中间表。 ```java @Entity public class User { @ManyToMany @JoinTable( name = "user_role", joinColumns =...

    Hibernate原理解析

    Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,包括集合映射、联合主键映射等,使得复杂的数据关系得以轻松管理。 10. **实体生命周期** Hibernate管理着对象的生命周期,包括初始化、持久化、...

Global site tag (gtag.js) - Google Analytics