组件映射

来源:互联网 发布:codol透视辅助源码 编辑:程序博客网 时间:2024/05/22 11:35

组件映射

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;

    }

}