- 浏览: 154869 次
- 性别:
- 来自: 大连
-
文章分类
最新评论
-
fddjxllren:
session.find()是不支持动态绑定参数的.要使用it ...
Hibernate查询之list/iterator -
xiaofeiyang:
http://svn.apache.org/repos/asf ...
struts,hibernate,spring 版本控制svn的URL地址 -
peterxiemin:
emp在建立的时候,报无效的月份,为什么 ?
oracle的练习表---employee -
java_bigniu:
...
Hibernate查询之list/iterator -
lanhai921:
学习下,谢谢分享。
itext基本用法
对于系统设计而言,应该尽量减少和避免在数据库表中引入与业务逻辑相关的主键关系;将业务逻辑主键引入库表,使得底层数据库表结构与业务逻辑想耦合,如果业务逻辑的变化,将很可能对底层数据库结构产生连带应影响;
例如:在项目开发初期,业务逻辑认为系统中的用户名是不可以重复的,随着新的需求产生,出现了用户名可重复的可能性,这样的话,我们就得从底层数据库开始更改,但是在某些关键的系统中,这样更在某些关键地方,将是一个大工程,这样的工作将难以接受;
这样,复合主键的引入,很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。因此在新的系统中,应该避免这样的设计;然而在旧的系统中遇到这样的情况,如果有复合主键的支持就显得很必要;
复合主键的使用,以Tuser为蓝本,将那么拆分成两个部分,firstname,lastname,以他们作为复合主键;对于复合主键而言,我们可以通过两种方式确定主键(Hibernate中通过<composite-id>定义复合主键):
- 基于实体类的复合主键
复合主键是由实体类的属性组成,此时,实体类本身也扮演着复合主键类的角色;定义如下(Hibernate要求复合主键类要实现equals和hasCode方法,以作为不同数据之间的标识):
Tuser类:
public class Tuser implements Serializable { private String firstName; private String lastName; private List email = new ArrayList(); private List address = new ArrayList(); get/set().... @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((address == null) ? 0 : address.hashCode()); result = prime * result + ((email == null) ? 0 : email.hashCode()); result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Tuser other = (Tuser) obj; if (address == null) { if (other.address != null) return false; } else if (!address.equals(other.address)) return false; if (email == null) { if (other.email != null) return false; } else if (!email.equals(other.email)) return false; if (firstName == null) { if (other.firstName != null) return false; } else if (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false; } else if (!lastName.equals(other.lastName)) return false; return true; } }
Tuser.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.keith"> <class name="Tuser" table="tUser"> <composite-id> <key-property name="firstName" /> <key-property name="lastName" /> </composite-id> <property name="email" type="com.keith.EmailList"></property> </class> </hibernate-mapping>
先添加一条数据(测试代码):
Tuser tUser = new Tuser(); tUser.setFirstName("keke"); tUser.setLastName("EEE"); List email = new ArrayList(); email.add("keith@gmail.com"); email.add("keith@sina.coom"); tUser.setEmail(email); session.save(tUser);
看下输出的SQL:
Hibernate: insert into tUser(email, firstName, lastName) values (?, ?, ?)
虽然数据已经添加进去了,但是对于表结构还有点模糊,看下表结构:
CREATE TABLE `tuser` ( `firstName` varchar(255) NOT NULL, `lastName` varchar(255) NOT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`firstName`,`lastName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这样就一目了然了,测试下如何查询(以tUser作为识别对象,通过session.load()方法加载数据):
Tuser tUser = new Tuser(); tUser.setFirstName("keke"); tUser.setLastName("EEE"); tUser = (Tuser) session.load(Tuser.class, tUser); System.out.println("tUser's Email:"+tUser.getEmail());
- 基于主键类的复合主键
我们也可以将主键逻辑加以隔离,以一个单独的主键类对复合主键进行描述;这样我们就需要一个TuserPK类(用来装Tuser的主键):
package com.keith; public class TuserPK implements java.io.Serializable { private String firstName; private String lastName; get()/set().... @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TuserPK other = (TuserPK) obj; if (firstName == null) { if (other.firstName != null) return false; } else if (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false; } else if (!lastName.equals(other.lastName)) return false; return true; } }
在Tuser中就这样:
public class Tuser implements Serializable { private TuserPK tuserpk; private List email = new ArrayList(); private List address = new ArrayList(); get()/set()... @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((address == null) ? 0 : address.hashCode()); result = prime * result + ((email == null) ? 0 : email.hashCode()); result = prime * result + ((tuserpk == null) ? 0 : tuserpk.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Tuser other = (Tuser) obj; if (address == null) { if (other.address != null) return false; } else if (!address.equals(other.address)) return false; if (email == null) { if (other.email != null) return false; } else if (!email.equals(other.email)) return false; if (tuserpk == null) { if (other.tuserpk != null) return false; } else if (!tuserpk.equals(other.tuserpk)) return false; return true; } }
属性文件里要这样(<composite-id name="tuserpk" class="TuserPK">):
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.keith"> <class name="Tuser" table="tUser"> <composite-id name="tuserpk" class="TuserPK"> <key-property name="firstName" /> <key-property name="lastName" /> </composite-id> <property name="email" type="com.keith.EmailList"></property> </class> </hibernate-mapping>
添加一条数据:
Tuser tUser = new Tuser(); TuserPK tUserPk = new TuserPK(); tUserPk.setFirstName("aaa"); tUserPk.setLastName("bbb"); tUser.setTuserpk(tUserPk); List email = new ArrayList(); email.add("keith@gmail.com"); email.add("keith@sina.coom"); tUser.setEmail(email); session.save(tUser);
根据主键进行查询:
Tuser tUser = new Tuser(); TuserPK tUserPk = new TuserPK(); tUserPk.setFirstName("aaa"); tUserPk.setLastName("bbb"); tUser = (Tuser) session.load(Tuser.class, tUserPk); System.out.println("tUser's Email:"+tUser.getEmail());
以上就是复合主键的用法!
发表评论
-
Hibernate之分页
2011-01-09 17:30 918在Hibernate中,通过对不同数据库的统一接口设计,实现了 ... -
hibernate之结果集排序
2011-01-09 17:07 1354无序集和有序集,是针对hibernate数据持久过程中,是否保 ... -
hibernate之Collection类型
2011-01-09 16:42 1465Collection类型: ... -
Hibernate之海量数据操作
2011-01-09 09:59 1075批量添加 在实 ... -
hibernate之数据存储
2011-01-07 16:33 7341,session.save(); 方法用于实体对象到数 ... -
hibernate之延迟加载(Lazy Loading)
2011-01-07 15:43 1210避免在某些情况下,关 ... -
Hibernate查询之list/iterator
2011-01-07 14:13 6367在Hibernate3中将Session.find(),Ses ... -
Hibernate之查询缓存(The Query Cache)
2011-01-07 09:21 1043查询的结果集也可以被缓存。只有当经常使用同样的参数进行查询时, ... -
hibernate之数据加载---Session.get/load
2011-01-06 16:54 1005Session.get/load() 都是根 ... -
hibernate之乐观锁(Optimistic Locking)
2011-01-06 16:34 1675相对于悲观锁,乐观锁采取了更加宽松的加锁机制,悲观锁大多数是依 ... -
Hibenate之悲观锁(Pessimistic Locking)
2011-01-06 15:34 1384什么是“锁”? 业务逻辑的实现过程中,往往需要保证数据的排他 ... -
Hibernate之事务管理
2011-01-06 15:00 829Hibernate是JDBC的轻量级封装,本身不具备事务管理能 ... -
初识---事务管理
2011-01-06 14:28 811何为“ 事务管理 ”? ... -
Hibernate之缓存同步策略
2011-01-06 13:43 1319缓存同步决定了数据对 ... -
Hibernate之数据缓存
2011-01-06 11:22 1105Hibernate数据缓存(cache ... -
认识数据缓存
2011-01-06 10:36 964数据缓存概述:在特定硬件基础上,缓存(Cache)往往是提升系 ... -
hibernate之脏数据检查
2011-01-06 09:54 2361HIbernate中有个名词---脏数据(dirty Data ... -
hibernate之实体对象生命周期
2011-01-06 09:16 1003在Hibernate的应用中,实体对象的生命周期,是一个关键的 ... -
Hibernate之数据加载方式
2011-01-05 23:09 1134Hibernate 的数据加载方式: 在JDBC的操作中,利 ... -
Hibenrate之多对多关联
2010-12-31 16:39 1132Hibernate多对多关联可以分成单向和双向,多对多关系会借 ...
相关推荐
《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...
"Hibernate复合主键" Hibernate复合主键是指在 Hibernate 框架中使用复合主键来唯一标识一个实体。复合主键是指由多个字段组成的主键,用于唯一标识一个实体。在本例中,我们将通过一个简单的复合主键的做关联类的...
在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据模型,它用于表示由多个属性共同构成的唯一标识。这种设计通常出现在实体类的某些属性组合起来才能唯一确定一个对象的情况下。本篇文章将...
在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本教程将深入探讨如何在Hibernate中设置复合主键,并提供一个可直接使用的配置示例。 ...
通过以上的解释,我们可以看到,虽然无主键表在数据库中并不常见,但在某些特定场景下,如复合主键,Hibernate提供了一套完整的解决方案。所提供的资源包括一个简单的Demo,可以实际运行并理解无主键表映射的实现...
当一个表的主键由两个或更多个字段组成时,我们称之为复合主键。复合主键确保了这些字段组合的唯一性,而单个字段可能不是唯一的。 二、为什么要使用复合主键? 在某些情况下,单一字段无法唯一标识表中的记录,...
本篇文章将深入探讨Hibernate如何支持和管理复合主键。 一、理解复合主键 在数据库设计中,复合主键是一种特殊情况,当单个字段不能唯一标识表中的每一行时,可以使用两个或多个字段的组合来创建唯一的标识。例如...
请更名为 Hibernate复合主键.part2.rar
更名为 Hibernate复合主键.part3.rar
如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...
本章讲解Hibernate中对数据库复合主键的支持
这篇文档将介绍如何使用Hibernate注解来生成复合主键或嵌入式主键。 复合主键(Composite Key)是指由两个或更多个列共同构成的唯一标识,而嵌入式主键(Embedded Key)则是将主键字段嵌入到实体类内部。在不使用...
在Java的Hibernate框架中,复合主键映射是一种处理多列组合成主键的情况,它使得在数据库表中由两个或更多个字段组成的主键能够被正确地映射到实体类。在使用复合主键时,我们需要遵循一定的步骤和规则。 首先,...
本文将详细探讨如何在SSH框架(Spring、Struts、Hibernate)中的实体类使用`@IdClass`注解来定义复合主键,并阐述其使用方法及注意事项。 #### 二、复合主键的定义与应用场景 复合主键是指由两个或两个以上的字段...
博文链接:https://balaschen.iteye.com/blog/155127