对于新系统的设计开发而言,我们应尽量避免在库表中引入与业务逻辑相关的主键关系。
将业务逻辑主键引入库表,以后业务逻辑的变化,将很可能对底层数据库结构产生连带影响。
复合主键的引入,很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。
因此,应尽量避免。但实际情况中,我们必须面对遗留系统的旧表开发,这时,对现有复合主键的支持就非常必要。
hibernate中,通过composite-id节点对复合主键进行定义。
我们可以通过两种形式确定主键:
1)基于实体类属性的复合主键
2)基于主键类的复合主键
下面通过例子看一下两种方式的用法。
我们建一个用户表user(firstname, lastname, age),以firstname, lastname作为复合主键。建表语句:
CREATE TABLE `hbm_test`.`user` (
`firstname` VARCHAR(50) NOT NULL DEFAULT '',
`lastname` VARCHAR(50) NOT NULL DEFAULT '',
`age` INTEGER UNSIGNED DEFAULT 0,
PRIMARY KEY(`firstname`, `lastname`)
)
ENGINE = InnoDB;
1)基于实体类属性的复合主键
映射文件如下:
<class name="User" table="user">
<composite-id>
<key-property
name="Lastname"
column="lastname"
type="string"
/>
<key-property
name="Firstname"
column="firstname"
type="string"
/>
</composite-id>
<property
name="Age"
column="age"
type="integer"
not-null="false"
length="10"
/>
</class>
通过composite-id节点声明了一个复合主键,是由“firstname" "lastname"组成。
实体类User中包含了复合主键firstname lastname,hibernate要求复合主键类实现equals hashCode,
以作为不同数据间的识别的标志。
public class User implements Serializable{
private String firstname;
private String lastname;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public boolean equals(Object obj){
if(!(obj instanceof User)){
return false;
}else{
User user = (User)obj;
return new EqualsBuilder().appendSuper(super.equals(obj))
.append(this.firstname, user.firstname)
.append(this.lastname, user.lastname)
.isEquals();
}
}
public int hashCode(){
return new HashCodeBuilder(-528253723, -475504089)
.appendSuper(super.hashCode())
.append(this.firstname)
.append(this.lastname)
.toHashCode();
}
}
EqualsBuilder HashCodeBuilder均为 apache common lang包中的工具类。
对于Session.load方法,我们可将User类对象本身作为查询条件:
User user = new User();
user.setFirstname("hello");
user.setLastname("world");
user = (User)session.load(User.class, user);
System.out.println("age: " + user.getAge());
2)基于主键类的复合主键
我们可以将主键逻辑加以分离,以一个单独的主键类对复合主键进行描述。
现在把User中的firstname lastname提取到一个独立的主键类UserPK中:
public class UserPK implements Serializable{
private String firstname;
private String lastname;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
}
之后修改映射文件的composite-id节点:
<composite-id name="userPk" class="UserPK">
<key-property
name="Lastname"
column="lastname"
type="string"
/>
<key-property
name="Firstname"
column="firstname"
type="string"
/>
</composite-id>
<property
name="Age"
column="age"
type="integer"
not-null="false"
length="10"
/>
只是配置了name和class属性,name指定了实体类中的主键类属性名,class指定了主键类类型。
User.java修改如下:
public class User implements Serializable{
private UserPK userPk;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public UserPK getUserPk() {
return userPk;
}
public void setUserPk(UserPK userPk) {
this.userPk = userPk;
}
}
之后,我们即可通过UserPK进行数据查询:
UserPK userPk = new UserPK();
userPk.setFirstname("hello");
userPk.setLastname("world");
User user = (User)session.load(User.class, userPk);
System.out.println("age: " + user.getAge());
via: http://www.zhuoda.org/irini/73145.html
- 浏览: 31906 次
- 性别:
- 来自: 北京
相关推荐
### Hibernate联合主键详解 #### 1. 定义联合主键 在Hibernate中定义联合主键主要依赖于`<composite-id>`标签。如示例文件所示,`Users`类被设计为具有联合主键,该主键由`name`和`tel`两个字段组成。在`...
在Hibernate中,我们可以使用`@Embeddable`和`@EmbeddedId`注解来定义和使用联合主键。 1. **创建联合主键类:** 在MyEclipse中,我们首先创建一个Java类来表示联合主键。这个类需要被标记为`@Embeddable`,并包含...
在Java的持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据模型设计,用于处理具有多个字段作为主键的实体。联合主键通常在数据表中的某些列共同决定了唯一标识的情况出现。在Hibernate中,有三种...
在 Hibernate 中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这种主键在数据库设计中常见于需要多个字段唯一标识一条记录的情况。在 Hibernate 中设置联合主键通常需要以下几个步骤: 1. **...
2. 在实体类中使用复合主键 接下来,在对应的实体类中,使用`@EmbeddedId`注解来指定复合主键类: ```java @Entity public class UserAddress { @EmbeddedId private AddressId id; // 其他属性、构造方法、...
在Java Hibernate框架中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这在处理一些特定的数据模型时非常有用。本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合...
在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架(Java Persistence API,简称...
接下来,我们需要在对应的实体类中使用`@EmbeddedId`注解引用我们的复合主键类。例如: ```java import javax.persistence.Entity; import javax.persistence.EmbeddedId; import javax.persistence.Table; @...
在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...
本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
请更名为 Hibernate复合主键.part2.rar
10. **多对一、一对多、多对多关联映射**: Hibernate支持各种复杂的关联关系,如实体间的关联映射配置,如外键、联合主键等。 综上,这份压缩包提供的文档涵盖了Hibernate的基本使用到高级特性,结合SQL参考手册,...
在Hibernate中,这种继承关系也可以被映射到数据库,如单表继承、联合继承和表-per-hierarchy等策略。 12. **延迟加载(Lazy Loading)**:为了提高性能,Hibernate支持属性和关联的延迟加载,即只有在真正需要时才...
### Hibernate中对数据库复合主键的支持 #### 一、引言 在软件开发过程中,特别是在J2EE领域中,Hibernate作为一种流行的ORM(Object-Relational Mapping)框架被广泛使用。ORM框架的主要作用是将关系型数据库中的...
你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么选择使用,,<bag> 或者 而不是 。 组合元素有个特别的用法是它可以包含一个元素。类似这样的映射允许你将一个many-to-many关联表映射为组合元素的...
在Hibernate中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,我们来看单向一对多关联的基本概念。在Java类中,我们将有一个“一”的类(如`Department`)和一个“多”的类(如`Employee`)。在`...
同时,Hibernate的Criteria API或HQL(Hibernate Query Language)可以帮助进行复杂的数据库查询,包括涉及多表连接的查询,这些查询可能涉及到联合主键和外键的使用。 综上所述,SSH2+JSON的结合提供了强大的后端...