`

[转]hiberante中使用复合主键

阅读更多
 
hiberante中使用复合主键

对于新系统的设计开发而言,我们应尽量避免在库表中引入与业务逻辑相关的主键关系。将业务逻辑主键引入库表,以后业务逻辑的变化,将很可能对底层数据库结构产生连带影响。复合主键的引入,很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。因此,应尽量避免。但实际情况中,我们必须面对遗留系统的旧表开发,这时,对现有复合主键的支持就非常必要。

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)基于实体类属性的复合主键

映射文件如下:

xml 代码
  1. <class name="User" table="user">  
  2.   
  3. <composite-id>  
  4.  <key-property  
  5.   name="Lastname"  
  6.   column="lastname"  
  7.   type="string"  
  8.  />  
  9.  <key-property  
  10.   name="Firstname"  
  11.   column="firstname"  
  12.   type="string"  
  13.  />  
  14. </composite-id>  
  15.   
  16. <property  
  17.  name="Age"  
  18.  column="age"  
  19.  type="integer"  
  20.  not-null="false"  
  21.  length="10"  
  22. />  
  23.   
  24. </class>  
  25.   

通过composite-id节点声明了一个复合主键,是由“firstname" "lastname"组成。

实体类User中包含了复合主键firstname lastname,hibernate要求复合主键类实现equals hashCode,以作为不同数据间的识别的标志。

java 代码
  1. public class User implements Serializable{   
  2.  private String firstname;   
  3.  private String lastname;   
  4.  private int age;   
  5.     
  6.  public int getAge() {   
  7.   return age;   
  8.  }   
  9.  public void setAge(int age) {   
  10.   this.age = age;   
  11.  }   
  12.  public String getFirstname() {   
  13.   return firstname;   
  14.  }   
  15.  public void setFirstname(String firstname) {   
  16.   this.firstname = firstname;   
  17.  }   
  18.  public String getLastname() {   
  19.   return lastname;   
  20.  }   
  21.  public void setLastname(String lastname) {   
  22.   this.lastname = lastname;   
  23.  }   
  24.     
  25.  public boolean equals(Object obj){   
  26.   if(!(obj instanceof User)){   
  27.    return false;   
  28.   }else{   
  29.    User user = (User)obj;   
  30.    return new EqualsBuilder().appendSuper(super.equals(obj))   
  31.       .append(this.firstname, user.firstname)   
  32.       .append(this.lastname, user.lastname)   
  33.       .isEquals();   
  34.   }   
  35.  }   
  36.     
  37.  public int hashCode(){   
  38.   return new HashCodeBuilder(-528253723, -475504089)   
  39.      .appendSuper(super.hashCode())   
  40.      .append(this.firstname)   
  41.      .append(this.lastname)   
  42.      .toHashCode();   
  43.  }   
  44. }   
  45.   

EqualsBuilder HashCodeBuilder均为 apache common lang包中的工具类。

对于Session.load方法,我们可将User类对象本身作为查询条件:

java 代码
  1. User user = new User();   
  2. user.setFirstname("hello");   
  3. user.setLastname("world");   
  4. user = (User)session.load(User.class, user);   
  5. System.out.println("age: " + user.getAge());  

2)基于主键类的复合主键

我们可以将主键逻辑加以分离,以一个单独的主键类对复合主键进行描述。
现在把User中的firstname lastname提取到一个独立的主键类UserPK中:

java 代码
  1. public class UserPK implements Serializable{   
  2.  private String firstname;   
  3.  private String lastname;   
  4.  public String getFirstname() {   
  5.   return firstname;   
  6.  }   
  7.  public void setFirstname(String firstname) {   
  8.   this.firstname = firstname;   
  9.  }   
  10.  public String getLastname() {   
  11.   return lastname;   
  12.  }   
  13.  public void setLastname(String lastname) {   
  14.   this.lastname = lastname;   
  15.  }   
  16.     
  17. }   
  18.   

之后修改映射文件的composite-id节点:

xml 代码
  1. <composite-id name="userPk" class="UserPK">  
  2.  <key-property  
  3.   name="Lastname"  
  4.   column="lastname"  
  5.   type="string"  
  6.  />  
  7.  <key-property  
  8.   name="Firstname"  
  9.   column="firstname"  
  10.   type="string"  
  11.  />  
  12. </composite-id>  
  13.   
  14. <property  
  15.  name="Age"  
  16.  column="age"  
  17.  type="integer"  
  18.  not-null="false"  
  19.  length="10"  
  20. />  
  21.   

只是配置了name和class属性,name指定了实体类中的主键类属性名,class指定了主键类类型。

User.java修改如下:

java 代码
  1. public class User implements Serializable{   
  2.  private UserPK userPk;   
  3.  private int age;   
  4.     
  5.  public int getAge() {   
  6.   return age;   
  7.  }   
  8.  public void setAge(int age) {   
  9.   this.age = age;   
  10.  }   
  11.  public UserPK getUserPk() {   
  12.   return userPk;   
  13.  }   
  14.  public void setUserPk(UserPK userPk) {   
  15.   this.userPk = userPk;   
  16.  }   
  17.     
  18. }   

之后,我们即可通过UserPK进行数据查询:

java 代码
  1. UserPK userPk = new UserPK();   
  2. userPk.setFirstname("hello");   
  3. userPk.setLastname("world");   
  4. User user = (User)session.load(User.class, userPk);   
  5. System.out.println("age: " + user.getAge());  
分享到:
评论

相关推荐

    Hiberante中的五大核心接口.txt

    在使用 `Session` 时,应当明确区分 Hibernate 中的 `Session` 与 JSP 中的 `HttpSession`,避免混淆。 #### 三、SessionFactory接口 `SessionFactory` 是用来创建 `Session` 对象的工厂,它是线程安全的,通常在...

    DAO层中对Hiberante

    DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问,通常与ORM框架如Hibernate一起使用,以隔离业务逻辑和数据存储之间的交互。 在给定的代码片段中,`HibernateDAO` 类是用来封装...

    hiberante3 注解帮助文档

    hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档

    hiberante查询方式使用详解

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。本文将深入探讨Hibernate的四种主要查询方式:HQL(Hibernate Query...

    hibernate使用主键关联的一对一关系

    在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...

    最新springboot2hiberante5项目

    最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....

    hiberante 源码 配置资料

    通过在实体类上使用@Entity、@Table、@Id等注解,可以声明对象的数据库映射信息,简化配置。 4. 缓存配置:Hibernate提供了一级缓存和二级缓存,一级缓存是Session级别的,而二级缓存可以通过第三方插件如Ehcache...

    hiberante中文帮助文档

    《Hibernate中文帮助文档》是Java开发领域中关于Hibernate框架的一份详尽参考资料,它涵盖了Hibernate的各个方面,旨在帮助开发者深入理解和高效使用这个强大的对象关系映射(ORM)工具。Hibernate作为一个开源的ORM...

    spring+mvc+hiberante

    然后,创建实体类(Entity),这些类代表数据库表,并使用 JPA 注解(如 @Entity, @Table, @Id 等)来指定它们与数据库的关系。DAO(数据访问对象)接口和实现类负责通过 SessionFactory 执行 CRUD(创建、读取、...

    hiberante5.0.7安装jar包

    在Java项目中使用Hibernate5.0.7,首先需要将这些jar包添加到项目的类路径中。这可以通过Maven或Gradle等构建工具完成,也可以手动将它们放入项目的`lib`目录下,并在IDE中配置类路径。 **三、配置文件** 主要的...

    Hiberante3.jar + API

    1. SessionFactory:它是整个Hibernate的核心,负责创建Session实例,配置信息(如数据库连接、映射文件等)都在SessionFactory中初始化。 2. Session:Session是与数据库交互的接口,用于执行CRUD操作(创建、读取...

    Hiberante 有关jar包

    Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分

    Struts+Hiberante+Sprint 框架整合

    开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root

    springmvc hiberante

    Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...

    hiberante annotations reference.pdf

    根据提供的文件信息,“hiberante annotations reference.pdf”主要介绍了Hibernate框架中的注解使用方法与参考。下面将基于标题、描述及部分文档内容进行详细的解析。 ### Hibernate注解概述 Hibernate是一个开源...

    hiberante4.2.3-part2

    hiberante4.2.3-part2

    Hiberante3相关文档

    描述中的“Hiberante3_HQL”提示我们将会涉及到Hibernate查询语言(HQL),它是面向对象的查询语言,允许开发者以类和对象的方式查询数据库。 “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过...

    Struts2+Hiberante+ajax+Mysql 三级联动

    总的来说,"Struts2+Hiberante+ajax+Mysql 三级联动"项目展示了如何利用这些技术进行高效的Web开发,特别是在处理多级交互和动态数据展示方面。通过学习和实践这样的项目,开发者可以提升对Java Web开发的理解,尤其...

    Struts2+hiberante+Spring+Extjs+OA办公系统,完整包

    在部署和使用过程中,开发者或管理员需要理解每个框架的基本原理和配置方法,以便于定制和优化系统。例如,配置Struts2的Action和结果集,设置Hibernate的实体类和映射文件,管理Spring的bean,以及使用ExtJS搭建...

    hiberante-4.2.3-part3

    hiberante-4.2.3-part3

Global site tag (gtag.js) - Google Analytics