【Hibernate持续更新】映射组件关系

来源:互联网 发布:java按层次遍历二叉树 编辑:程序博客网 时间:2024/06/05 15:22

知识准备:hibernate将对象分为二种类型

1. 含有OID的对象:实体类型

2. 不含OID的对象:值类型

案例:客户和公司地址和家庭地址

声明:客户和地址是整体与部分的关系,在数据库中只需要建立一个表Users

第一步,创建表:

use db3;drop table if exists users;create table if not exists users(id int primary key auto_increment,name varchar(10),salary double,com_privince varchar(10),com_city varchar(10),com_area varchar(10),home_privince varchar(10),home_city varchar(10),home_area varchar(10));
查看users表结构(desc user):

mysql> use db3;Database changedmysql> desc users;+---------------+-------------+------+-----+---------+----------------+| Field         | Type        | Null | Key | Default | Extra          |+---------------+-------------+------+-----+---------+----------------+| id            | int(11)     | NO   | PRI | NULL    | auto_increment || name          | varchar(10) | YES  |     | NULL    |                || salary        | double      | YES  |     | NULL    |                || com_privince  | varchar(10) | YES  |     | NULL    |                || com_city      | varchar(10) | YES  |     | NULL    |                || com_area      | varchar(10) | YES  |     | NULL    |                || home_privince | varchar(10) | YES  |     | NULL    |                || home_city     | varchar(10) | YES  |     | NULL    |                || home_area     | varchar(10) | YES  |     | NULL    |                |+---------------+-------------+------+-----+---------+----------------+9 rows in set (0.01 sec)

第二步:建立实体类并配置映射文件

User.java

package cn.lsh.web.hibernate.domain;public class User {private Integer id;//编号private String name;//姓名private Double salary;//薪水private Address comAddress;//公司地址private Address homeAddress;//家庭地址public User() {}public User(String name, Double salary) {super();this.name = name;this.salary = salary;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getSalary() {return salary;}public void setSalary(Double salary) {this.salary = salary;}public Address getComAddress() {return comAddress;}public void setComAddress(Address comAddress) {this.comAddress = comAddress;}public Address getHomeAddress() {return homeAddress;}public void setHomeAddress(Address homeAddress) {this.homeAddress = homeAddress;}}

User.java类所对应的映射文件:

User.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.lsh.web.hibernate.domain">    <class name="User" table="users" >    <id name="id" column="ID" type="integer">    <generator class="native"/>    </id>    <property name="name" column="NAME" type="string"/>    <property name="salary" column="SALARY" type="double"/>        <!-- component专用于映射组件类型 -->    <component name="comAddress" class="Address">    <property name="province" column="COM_PRIVINCE" type="string"/>    <property name="city" column="COM_CITY" type="string"/>    <property name="area" column="COM_AREA" type="string"/>    </component>    <component name="homeAddress" class="Address">    <property name="province" column="HOME_PRIVINCE" type="string"/>    <property name="city" column="HOME_CITY" type="string"/>    <property name="area" column="HOME_AREA" type="string"/>    </component>    </class>    </hibernate-mapping>

Address.java

//部分方、无id属性,值类型public class Address {private String province;//省private String city;//市private String area;//区public Address(){}public Address(String province, String city, String area) {super();this.province = province;this.city = city;this.area = area;}//省略set/get方法}

需求1保存客户和地址

第三步:建立ComponentDao.java(使用junit)

//添加客户@Testpublic void addUser(){Address comAddress = new Address("湖南省","长沙市","雨花区");Address homeAddress = new Address("湖南省","长沙市","望城区");User user = new User("王五",9000D);//设置整体和部分的关系user.setComAddress(comAddress);user.setHomeAddress(homeAddress);Session session = HibernateUtils.getSession();Transaction t = session.getTransaction();try{t.begin();session.save(user);t.commit();}catch(Exception e){e.printStackTrace();t.rollback();}finally{session.close();}}

</pre><pre>

需求2更新客户和地址

//更新客户@Testpublic void updateUser(){Session session = HibernateUtils.getSession();Transaction t = session.getTransaction();try{t.begin();User user = (User)session.get(User.class, 2);user.getComAddress().setArea("白云区");user.getHomeAddress().setArea("花都区");session.save(user);t.commit();}catch(Exception e){e.printStackTrace();t.rollback();}finally{session.close();}}

需求3删除客户和地址

//删除客户@Testpublic void deleteUser(){Session session = HibernateUtils.getSession();Transaction t = session.getTransaction();try{t.begin();User user = (User)session.get(User.class, 3);session.delete(user);t.commit();}catch(Exception e){e.printStackTrace();t.rollback();}finally{session.close();}}
查询结果如下:

select * from users;


Hibernate关于映射组件关系(关键部分代码):

<!-- component专用于映射组件类型 -->    <component name="comAddress" class="Address">    <property name="province" column="COM_PRIVINCE" type="string"/>    <property name="city" column="COM_CITY" type="string"/>    <property name="area" column="COM_AREA" type="string"/>    </component>    <component name="homeAddress" class="Address">    <property name="province" column="HOME_PRIVINCE" type="string"/>    <property name="city" column="HOME_CITY" type="string"/>    <property name="area" column="HOME_AREA" type="string"/>    </component>





0 0