`

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

映射文件如下:
<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层中对Hiberante

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

    Hiberante中的五大核心接口.txt

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

    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中文帮助文档

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

    hiberante 源码 配置资料

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

    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是一个开源...

    Hiberante3相关文档

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

    hiberante4.2.3-part2

    hiberante4.2.3-part2

    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