对于新系统的设计开发而言,我们应尽量避免在库表中引入与业务逻辑相关的主键关系。将业务逻辑主键引入库表,以后业务逻辑的变化,将很可能对底层数
据库结构产生连带影响。复合主键的引入,很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。因此,应尽量避免。但实际情况中,我们必须面对遗留系统的
旧表开发,这时,对现有复合主键的支持就非常必要。
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());
来源:http://www.zhuoda.org/irini/73145.html
相关推荐
DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问,通常与ORM框架如Hibernate一起使用,以隔离业务逻辑和数据存储之间的交互。 在给定的代码片段中,`HibernateDAO` 类是用来封装...
在使用 `Session` 时,应当明确区分 Hibernate 中的 `Session` 与 JSP 中的 `HttpSession`,避免混淆。 #### 三、SessionFactory接口 `SessionFactory` 是用来创建 `Session` 对象的工厂,它是线程安全的,通常在...
hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。本文将深入探讨Hibernate的四种主要查询方式:HQL(Hibernate Query...
在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...
最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....
《Hibernate中文帮助文档》是Java开发领域中关于Hibernate框架的一份详尽参考资料,它涵盖了Hibernate的各个方面,旨在帮助开发者深入理解和高效使用这个强大的对象关系映射(ORM)工具。Hibernate作为一个开源的ORM...
通过在实体类上使用@Entity、@Table、@Id等注解,可以声明对象的数据库映射信息,简化配置。 4. 缓存配置:Hibernate提供了一级缓存和二级缓存,一级缓存是Session级别的,而二级缓存可以通过第三方插件如Ehcache...
然后,创建实体类(Entity),这些类代表数据库表,并使用 JPA 注解(如 @Entity, @Table, @Id 等)来指定它们与数据库的关系。DAO(数据访问对象)接口和实现类负责通过 SessionFactory 执行 CRUD(创建、读取、...
在Java项目中使用Hibernate5.0.7,首先需要将这些jar包添加到项目的类路径中。这可以通过Maven或Gradle等构建工具完成,也可以手动将它们放入项目的`lib`目录下,并在IDE中配置类路径。 **三、配置文件** 主要的...
1. SessionFactory:它是整个Hibernate的核心,负责创建Session实例,配置信息(如数据库连接、映射文件等)都在SessionFactory中初始化。 2. Session:Session是与数据库交互的接口,用于执行CRUD操作(创建、读取...
Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分
开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root
Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...
根据提供的文件信息,“hiberante annotations reference.pdf”主要介绍了Hibernate框架中的注解使用方法与参考。下面将基于标题、描述及部分文档内容进行详细的解析。 ### Hibernate注解概述 Hibernate是一个开源...
描述中的“Hiberante3_HQL”提示我们将会涉及到Hibernate查询语言(HQL),它是面向对象的查询语言,允许开发者以类和对象的方式查询数据库。 “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过...
hiberante4.2.3-part2
总的来说,"Struts2+Hiberante+ajax+Mysql 三级联动"项目展示了如何利用这些技术进行高效的Web开发,特别是在处理多级交互和动态数据展示方面。通过学习和实践这样的项目,开发者可以提升对Java Web开发的理解,尤其...
在部署和使用过程中,开发者或管理员需要理解每个框架的基本原理和配置方法,以便于定制和优化系统。例如,配置Struts2的Action和结果集,设置Hibernate的实体类和映射文件,管理Spring的bean,以及使用ExtJS搭建...
hiberante-4.2.3-part3