`
z75148885
  • 浏览: 191596 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate复合主键

阅读更多
复合主键,由多个字段组成主键,例如,使用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复合主键配置和使用

    《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...

    hibernate复合主键映射

    复合主键映射 &lt;br&gt;通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射

    hibernate复合主键设置

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本教程将深入探讨如何在Hibernate中设置复合主键,并提供一个可直接使用的配置示例。 ...

    Hibernate复合主键视频2

    请更名为 Hibernate复合主键.part2.rar

    Hibernate复合主键3

    更名为 Hibernate复合主键.part3.rar

    hibernate复合主键的实例

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本实例将深入探讨如何在Hibernate中实现复合主键,并提供一个具体的示例来帮助理解。 ...

    Hibernate复合主键.

    本篇文章将深入探讨Hibernate如何支持和管理复合主键。 一、理解复合主键 在数据库设计中,复合主键是一种特殊情况,当单个字段不能唯一标识表中的每一行时,可以使用两个或多个字段的组合来创建唯一的标识。例如...

    Hibernate复合主键part1

    本章讲解Hibernate中对数据库复合主键的支持

    hibernate 无主键表映射

    通过以上的解释,我们可以看到,虽然无主键表在数据库中并不常见,但在某些特定场景下,如复合主键,Hibernate提供了一套完整的解决方案。所提供的资源包括一个简单的Demo,可以实际运行并理解无主键表映射的实现...

    hibernate复合主键及关联的实现

    博文链接:https://balaschen.iteye.com/blog/155127

    Java的Hibernate框架中复合主键映射的创建和使用教程

    在Java的Hibernate框架中,复合主键映射是一种处理多列组合成主键的情况,它使得在数据库表中由两个或更多个字段组成的主键能够被正确地映射到实体类。在使用复合主键时,我们需要遵循一定的步骤和规则。 首先,...

    Hibernate学习笔记

    复合主键关联映射则是处理具有多个字段作为主键的表与对象之间的映射。 通过理解这些知识点,开发者可以更有效地利用Hibernate框架来开发复杂的企业级应用,处理数据持久化以及对象和关系数据库之间的映射。...

    演示怎样在Hibernate中使用复合主键

    如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...

Global site tag (gtag.js) - Google Analytics