有时一个实体的主键可能同时为多个,例如下面使用的字典“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注解实现联合主键 在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架...
在Hibernate中,我们可以使用`@Embeddable`和`@EmbeddedId`注解来定义和使用联合主键。 1. **创建联合主键类:** 在MyEclipse中,我们首先创建一个Java类来表示联合主键。这个类需要被标记为`@Embeddable`,并包含...
现在,大多数项目都使用注解配置,但如果你仍然需要处理旧的项目,这里是如何配置的示例: ```xml <hibernate-mapping> <!-- 其他属性 --> </hibernate-mapping> ``` 四、保存和查询带有复合主键的...
本主题将深入探讨Hibernate注解的相关知识点。 1. **注解概述**: 注解(Annotations)是Java 5引入的一种元数据,它提供了在源代码中嵌入信息的方式,这些信息可以被编译器或者在运行时的Java虚拟机使用。在...
Hibernate 提供了多种继承映射策略,如 `@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`、`@DiscriminatorColumn` 和 `@DiscriminatorValue`,以支持单表继承、子类表和联合主键等。 #### 映射关联关系 - ...
本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...
在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...
通过以上步骤,我们就成功地在Hibernate中配置了一个复合主键的实例。在实际开发中,根据具体需求调整实体和复合主键类的属性,以满足业务场景。 四、总结 复合主键在多字段标识的情况下非常有用,它可以保证数据...
Hibernate注解是元数据的一种形式,它们允许我们在Java类和属性上直接声明关于如何映射到数据库的信息,避免了XML配置文件的繁琐。通过注解,我们可以指定实体类、属性、关联关系等如何对应到数据库表和字段。 二、...
总结来说,Hibernate复合主键映射是处理多字段主键的关键技术,它通过`@Embeddable`和`@EmbeddedId`注解以及相应的XML配置,使开发者能够方便地管理和操作具有复合主键的实体。在开发过程中,正确理解和使用这项功能...
这可以通过在`hibernate.cfg.xml`或实体类的注解中定义主键策略来实现。以注解为例,可以使用`@EmbeddedId`注解来指定一个复合主键: ```java import javax.persistence.EmbeddedId; import javax.persistence....
Hibernate 是一个流行的对象...总的来说,这个中文帮助文档详尽地阐述了使用Hibernate注解进行数据库映射的各种细节,对于理解和使用Hibernate进行Java开发非常有帮助。无论是新手还是经验丰富的开发者,都能从中受益。
在Hibernate中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,我们来看单向一对多关联的基本概念。在Java类中,我们将有一个“一”的类(如`Department`)和一个“多”的类(如`Employee`)。在`...
- 联合主键是多个字段共同构成的主键,可以通过@EmbeddedId和@Embeddable注解实现。 - 复合主键是自动生成的主键,通过@TableGenerator或@IdClass实现。 **8. 异常处理** - Hibernate提供了自己的异常体系,如...
五、联合主键(Composite Key) 在某些情况下,实体的主键可能由两个或更多个字段组成。这时,我们需要使用`@EmbeddedId`和`@Embeddable`注解来定义复合主键类和其属性。`@EmbeddedId`用于指定实体的主键类,而`@...
11. **联合主键**:当一个表的主键由两个或更多列组成时,需要使用联合主键来映射。 12. **继承映射**:Hibernate支持单表继承、联合继承和表格-per-class继承策略,学习者应了解每种策略的适用场景。 通过本教程...
### Hibernate 注解配置详解 #### 版本说明 文档中提到的版本为 3.2.0CR1,这是一个早期的版本,可能与当前最新的 Hibernate 版本存在一定的差异。尽管如此,其中介绍的基本概念和技术仍然具有参考价值。 #### ...
3. **对象关系映射**:Hibernate的核心功能在于对象关系映射,它通过注解或XML配置将Java类与数据库表关联,实现对象的持久化。 4. **Session接口**:在Hibernate中,Session是与数据库交互的主要接口,负责保存、...
通常需要一个中间表来存储两个实体的联合主键。配置时使用`@ManyToMany`,并可通过`@JoinTable`定义中间表。 ```java @Entity public class User { @ManyToMany @JoinTable( name = "user_role", joinColumns =...
Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,包括集合映射、联合主键映射等,使得复杂的数据关系得以轻松管理。 10. **实体生命周期** Hibernate管理着对象的生命周期,包括初始化、持久化、...