复合主键,由多个字段组成主键,例如,使用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);
}
}
分享到:
相关推荐
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
hibernate复合主键设置,里面很全面的配置,可以拿到直接用
NULL 博文链接:https://liuna718-163-com.iteye.com/blog/748089
hibernate复合主键的实例,hibernate复合主键的实例。
请更名为 Hibernate复合主键.part2.rar
更名为 Hibernate复合主键.part3.rar
Hibernate复合主键.
本章讲解Hibernate中对数据库复合主键的支持
hibernate 无主键表映射资源说明: 1. 简单Demo 2. Demo对应的sql语句 3. 对应博客文档
博文链接:https://balaschen.iteye.com/blog/155127
023 复合主键 关联映射 024 其它 关联映射 025 hibernate 悲观锁、乐观锁 026 hibernate 操作树形结构 027 hibernate 查询语言(HQL) 028 hibernate 缓存(性能优化策略) 029 hibernate 抓取策略
复合主键映射用起来比普通的增加主键字段要复杂,这里我们就来共同学习Java的Hibernate框架中复合主键映射的创建和使用教程,需要的朋友可以参考下
如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...