组件映射
Hibernate建议在进行领域模型时要细粒度一些,简单的说,就是类比表多,这种映射方式就是组建映射
组件类是值类型,既它没有对象标识符属性,在数据库中也没有对应的表,它只是隶属于另一个持久化类的实例
值类型对象是指它对应的类没有对象标识符属性,只能作为一个持久化类的属性使用
当组件的属性已经不能和表中的字段简单的对应时使用
组建映射的应用有三种情况:
1、 把组件类作为持久化类的单个属性来使用
2、 把组件类作为持久化类的集合属性来使用
3、 把组件类作为持久化类的对象标识符来使用
组件作为持久化类的单个属性使用的小实例:
User.java部分:
package com.hbsi.domain;
import java.util.Date;
public class User {
private int id;
private Name name;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User[id=" + id + ", "
+ (name != null ? "name=" + name + ", " : "")
+ (birthday != null ? "birthday=" + birthday : "") + "]";
}
}
User.hbm.xml部分
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.hbsi.domain">
<class name="User" table="user">
<id name="id"column="id">
<!-- native自动增长 根据不同的底层数据库选择产生不同的策略 -->
<generator class="native"/>
</id>
<!-- 做组件映射 -->
<component name="name">
<property name="firstName"column="first_name"/>
<property name="lastName"column="last_name"/>
</component>
<property name="birthday"/>
</class>
</hibernate-mapping>
TestHibernate.java部分
package com.hbsi.test;
import java.util.Date;
importorg.hibernate.HibernateException;
import org.hibernate.Session;
importorg.hibernate.Transaction;
import com.hbsi.domain.Name;
import com.hbsi.domain.User;
importcom.hbsi.hibernate.utils.HibernateUtil;
public class TestHibernate {
public static void main(String[] args) {
User user=new User();
Name name=new Name();
name.setFirstName("shuang");
name.setLastName("han");
user.setName(name);
user.setBirthday(new Date());
addUser(user);
}
public static void addUser(User user){
Session session=null;
Transaction tx=null;
try{
//获取到session对象
session=HibernateUtil.getSession();
tx=session.beginTransaction();
session.save(user);
tx.commit();
}catch(HibernateException ex){
//对异常的处理
if(tx!=null){
tx.rollback();//把事务回滚了
}
throw ex;
}finally{//保证资源得到释放
if(session!=null){
session.close();
}
}
}
}
Name.java部分
package com.hbsi.domain;
public class Name {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}