数据库结构
create table component(name varchar(50) not null,
sex varchar(50) not null,
description varchar(50),
primary key(name,sex));
主键类,一定要实现Serializable接口,并改写equals和hascode方法
package
component;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.io.Serializable;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
org.apache.commons.lang.builder.EqualsBuilder;
import
org.apache.commons.lang.builder.HashCodeBuilder;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
ComponentPK
implements
Serializable
...
{
private String name;
private String sex;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getName() ...{
return name;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setName(String name) ...{
this.name = name;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getSex() ...{
return sex;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setSex(String sex) ...{
this.sex = sex;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public boolean equals(Object obj) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(obj == this) ...{
return true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!(obj instanceof Component)) ...{
return false;
}
ComponentPK componentpk = (ComponentPK) obj;
return new EqualsBuilder()
.append(this.name, componentpk.getName())
.append(this.sex, componentpk.getSex())
.isEquals();
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int hashCode() ...{
return new HashCodeBuilder()
.append(this.name)
.append(this.sex)
.toHashCode();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
package
component;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
Component
...
{
private String description;
private ComponentPK componentpk;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public ComponentPK getComponentpk() ...{
return componentpk;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setComponentpk(ComponentPK componentpk) ...{
this.componentpk = componentpk;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getDescription() ...{
return description;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setDescription(String description) ...{
this.description = description;
}
}
HBM文件
<?
xml version="1.0" encoding="utf-8"
?>
<!
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<
hibernate-mapping
package
="component"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
class
name
="Component"
table
="component"
>
<
composite-id
name
="componentpk"
class
="ComponentPK"
unsaved-value
="any"
>
<
key-property
name
="name"
column
="name"
type
="java.lang.String"
/>
<
key-property
name
="sex"
column
="sex"
type
="java.lang.String"
/>
</
composite-id
>
<
property
name
="description"
column
="description"
type
="java.lang.String"
/>
</
class
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
hibernate-mapping
>
测试代码:
public
static
void
main(String[] args)
...
{
Configuration cfg=new Configuration();
cfg.configure();
SessionFactory sf=cfg.buildSessionFactory();
Session session=sf.openSession();
Transaction t=session.beginTransaction();
ComponentPK pk=new ComponentPK();
pk.setName("1");
pk.setSex("3");
Component component=new Component();
component.setComponentpk(pk);
component.setDescription("12");
session.save(component);
t.commit();
System.out.println("success");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
如果组成复合主键的某一个属性是其他持久话类的话,则需要使用<key many-to-one>
增加表User:
CREATE TABLE `user` (
`id` varchar(50) NOT NULL,
`pass` varchar(50) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
增加持久化类User及相应的Mapping文件
package
component;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
User
...
{
private String id;
private String pass;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getId() ...{
return id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setId(String id) ...{
this.id = id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getPass() ...{
return pass;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setPass(String pass) ...{
this.pass = pass;
}
}
<?xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<!DOCTYPE hibernate-mapping PUBLIC
"
-//Hibernate/Hibernate Mapping DTD 3.0//EN
"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
"
>
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping package
=
"
component
"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<class name
=
"
User
"
table
=
"
user
"
>
<id name
=
"
id
"
column
=
"
id
"
>
<generator class
=
"
assigned
"
></generator>
</id>
<property name
=
"
pass
"
column
=
"
pass
"
type
=
"
java.lang.String
"
/>
</class>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</hibernate-mapping>
修改ComponentPK类
package
component;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.io.Serializable;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
org.apache.commons.lang.builder.EqualsBuilder;
import
org.apache.commons.lang.builder.HashCodeBuilder;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
ComponentPK
implements
Serializable
...
{
private String name;
private String sex;
private User user;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public User getUser() ...{
return user;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setUser(User user) ...{
this.user = user;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getName() ...{
return name;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setName(String name) ...{
this.name = name;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getSex() ...{
return sex;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setSex(String sex) ...{
this.sex = sex;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public boolean equals(Object obj) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(obj == this) ...{
return true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!(obj instanceof Component)) ...{
return false;
}
ComponentPK componentpk = (ComponentPK) obj;
return new EqualsBuilder()
.append(this.name, componentpk.getName())
.append(this.sex, componentpk.getSex())
.isEquals();
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int hashCode() ...{
return new HashCodeBuilder()
.append(this.name)
.append(this.sex)
.toHashCode();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
修改Component.hbm.xml
<
hibernate-mapping
package
="component"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
class
name
="Component"
table
="component"
>
<
composite-id
name
="componentpk"
class
="ComponentPK"
unsaved-value
="any"
>
<
key-property
name
="name"
column
="name"
type
="java.lang.String"
/>
<
key-property
name
="sex"
column
="sex"
type
="java.lang.String"
/>
<
key-many-to-one
name
="user"
class
="User"
column
="userid"
access
="field"
foreign-key
="id"
></
key-many-to-one
>
</
composite-id
>
<
property
name
="description"
column
="description"
type
="java.lang.String"
/>
</
class
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
hibernate-mapping
>
修改测试代码:
public
static
void
main(String[] args)
...
{
Configuration cfg=new Configuration();
cfg.configure();
SessionFactory sf=cfg.buildSessionFactory();
Session session=sf.openSession();
Transaction t=session.beginTransaction();
User user=(User)session.get(User.class, "11111");
ComponentPK pk=new ComponentPK();
pk.setName("1");
pk.setSex("3");
pk.setUser(user);
Component component=new Component();
component.setComponentpk(pk);
component.setDescription("12");
session.save(component);
t.commit();
System.out.println("success");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
可以看到数据库结果如下:
User(id为111111)
Component的联合主键(name,sex,userid),其中userid已经引用了user表的主键