复合主键,由多个字段组成主键,例如,使用firstname和lastname组成主键。
可以通过两种方式确定主键,一种是基于实体类的复合主键,另一种是通过定义主键类来实现。
不管通过哪种方式,复合主键都需要实现equals方法和hashcode方法,以作为不同数据之间是别的标志。
一.基于实体类属性的复合主键
主键由实体类中的属性组成。
1.
配置文件TUser.hbm.xml
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<classname="cn.blogjava.start.TUser"table="t_user"catalog="sample">
<composite-id>
<key-propertyname="lastname"column="lastname"type="string"/>
<key-propertyname="firstname"column="firstname"type="string"/>
</composite-id>
<propertyname="age"type="integer"column="age"/>
</class>
</hibernate-mapping>
2.
TUser.java
packagecn.blogjava.start;
importorg.apache.commons.lang.builder.EqualsBuilder;
importorg.apache.commons.lang.builder.HashCodeBuilder;
/**
*TUsergeneratedbyhbm2java
*/
publicclassTUserimplementsjava.io.Serializable{
//Fields
privateIntegerage;
privateStringfirstname;
privateStringlastname;
publicIntegergetAge(){
returnage;
}
publicvoidsetAge(Integerage){
this.age=age;
}
publicStringgetFirstname(){
returnfirstname;
}
publicvoidsetFirstname(Stringfirstname){
this.firstname=firstname;
}
publicStringgetLastname(){
returnlastname;
}
publicvoidsetLastname(Stringlastname){
this.lastname=lastname;
}
publicbooleanequals(Objectobj){
if(!(objinstanceofTUser)){
returnfalse;
}
TUseruser=(TUser)obj;
returnnewEqualsBuilder() // EqualsBuilder 和HashCodeBuilder均为apache common lang包中的工具类
.appendSuper(super.equals(obj))
.append(this.lastname,user.lastname)
.append(this.firstname,user.firstname)
.isEquals();
}
publicinthasCode(){
returnnewHashCodeBuilder(-528253723,-475504089)
.appendSuper(super.hashCode())
.append(this.lastname).append(this.firstname)
.toHashCode();
}
}
3.
测试类HibernateTest.java
packagecn.blogjava.start;
importjunit.framework.Assert;
importjunit.framework.TestCase;
importorg.hibernate.HibernateException;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
publicclassHibernateTestextendsTestCase{
Sessionsession=null;
/**
*JUnit中的setUp方法在TestCase初始化的时候会自动调用
*一般用于初始化公用资源
*/
protectedvoidsetUp(){
try{
/**
*可以采用hibernate.properties或者hibernate.cfg.xml
*配置文件的初始化代码
*
*采用hibernate.properties
*Configurationconfig=newConfiguration();
*config.addClass(TUser.class);
*/
//采用hibernate.cfg.xml配置文件,与上面的方法对比,两个差异
//1.Configuration的初始化方式
//2.xml
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
session=sessionFactory.openSession();
}catch(HibernateExceptione){
//TODO:handleexception
e.printStackTrace();
}
}
/**
*JUnit中的tearDown方法在TestCase执行完毕的时候会自动调用
*一般用于释放资源
*/
protectedvoidtearDown(){
try{
session.close();
}catch(HibernateExceptione){
//TODO:handleexception
e.printStackTrace();
}
}
/**
*对象持久化测试(Insert方法)
*/
publicvoidtestInsert(){
Transactiontran=null;
try{
tran=session.beginTransaction();
TUseruser=newTUser();
user.setFirstname("bai");
user.setLastname("yunfeng");
user.setAge(26);
session.save(user);
session.flush();
tran.commit();
}catch(HibernateExceptione){
//TODO:handleexception
e.printStackTrace();
Assert.fail(e.getMessage());
if(tran!=null){
try{
tran.rollback();
}catch(Exceptione1){
//TODO:handleexception
e1.printStackTrace();
}
}
}
}
/**
*对象读取测试(Select方法)
*/
publicvoidtestSelect(){
TUseruser=newTUser();
user.setFirstname("bai");
user.setLastname("yunfeng");
user=(TUser)session.load(TUser.class,user);
Assert.assertEquals(user.getAge().intValue(),26);
}
}
分享到:
相关推荐
《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本教程将深入探讨如何在Hibernate中设置复合主键,并提供一个可直接使用的配置示例。 ...
请更名为 Hibernate复合主键.part2.rar
更名为 Hibernate复合主键.part3.rar
在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本实例将深入探讨如何在Hibernate中实现复合主键,并提供一个具体的示例来帮助理解。 ...
本篇文章将深入探讨Hibernate如何支持和管理复合主键。 一、理解复合主键 在数据库设计中,复合主键是一种特殊情况,当单个字段不能唯一标识表中的每一行时,可以使用两个或多个字段的组合来创建唯一的标识。例如...
本章讲解Hibernate中对数据库复合主键的支持
通过以上的解释,我们可以看到,虽然无主键表在数据库中并不常见,但在某些特定场景下,如复合主键,Hibernate提供了一套完整的解决方案。所提供的资源包括一个简单的Demo,可以实际运行并理解无主键表映射的实现...
博文链接:https://balaschen.iteye.com/blog/155127
在Java的Hibernate框架中,复合主键映射是一种处理多列组合成主键的情况,它使得在数据库表中由两个或更多个字段组成的主键能够被正确地映射到实体类。在使用复合主键时,我们需要遵循一定的步骤和规则。 首先,...
复合主键关联映射则是处理具有多个字段作为主键的表与对象之间的映射。 通过理解这些知识点,开发者可以更有效地利用Hibernate框架来开发复杂的企业级应用,处理数据持久化以及对象和关系数据库之间的映射。...
如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...