现在的位置: 首页 > 综合 > 正文

Hibernate进阶之组件类型认识和双向一对多关系混合映射

2014年09月27日 ⁄ 综合 ⁄ 共 5131字 ⁄ 字号 评论关闭

上一篇介绍Hibernate的双向多对多关系映射,接下来认识组件类型以及联合双向一对多关系来加深一下认识。

首先对下面的知识做一下总结:

映射组件和双向一对多关系【 一个明星购买多辆汽车,其中明星所在的地址是组件类型】
   (1)hibernate将持久化对象分为二种类型
        (A)实体型:具有id属性的类,将来会映射成一条含有id主健的完整记录
        (B)值类型或组件:不具有id属性的类,将来不会映射成一条含有id主健的完整记录,即只会映射成
                          一条完整记录的一部份
             <component name="address" class="Address">
<property name="province" column="PROVINCE"/>
<property name="city" column="CITY"/>
<property name="area" column="AREA"/>
    </component>
    接下来让我们用例子来认识一下:

第一步:我们无需创建mysql表,借助于Hibernate帮我们自动生成数据库表(把hibernate.hbm2ddl.auto=update:),在hibernate.properties配置如下:

#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://127.0.0.1:3306/example_db
hibernate.connection.username=root
hibernate.connection.password=04010
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update

第二步,写实体类,Star类,Car类,Address类。

Address类:

package example.component;
/**
 * 组件类型(值类型)
 * @author Administrator
 *
 */
public class Address {

	private String province;//省份
	private String city;//城市
	private String area;//地区
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getArea() {
		return area;
	}
	public void setArea(String area) {
		this.area = area;
	}
	public Address(String province, String city, String area) {
		this.province = province;
		this.city = city;
		this.area = area;
	}
	public Address() {
	}
	
	
}

Star类:

package example.component;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 实体类型
 * 明星:一的一方
 * @author Administrator
 *
 */
public class Star {

	private Integer id;
	private String name;
	private String gender;
	private Address address;//组件类型
	private Set<Car> carSet=new LinkedHashSet<Car>();//关联的属性
	public Star() {
		// TODO Auto-generated constructor stub
	}
	public Star( String name, String gender) {
		this.name = name;
		this.gender = gender;
	}
	
	public Set<Car> getCarSet() {
		return carSet;
	}
	public void setCarSet(Set<Car> carSet) {
		this.carSet = carSet;
	}
	public Address getAdress() {
		return address;
	}
	public void setAdress(Address address) {
		this.address = address;
	}
	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 String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	
	
}

Car类:

package example.component;

/**
 * 轿车:多的一方
 * @author Administrator
 *
 */
public class Car {

	private Integer id;
	private String name;
	private Integer price;
	private Star star;//关联的属性
	public Car() {
		// TODO Auto-generated constructor stub
	}
	public Car(String name, Integer price) {
		this.name = name;
		this.price = price;
	}
	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 Integer getPrice() {
		return price;
	}
	public void setPrice(Integer price) {
		this.price = price;
	}
	public Star getStar() {
		return star;
	}
	public void setStar(Star star) {
		this.star = star;
	}
	
	
}

第三步,写映射配置文件Star.hbm.xml如下:

<?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">
<hibernate-mapping package="example.component">
<!-- 映射Star类(实体型,单方) -->
	<class name="Star" table="stars">
		<id name="id" column="id" type="int">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" ></property>
		<property name="gender" column="gender"></property>
		<!-- 以下映射组件型 -->
		<component name="address" class="Address">
			<property name="province" column="province"></property>
			<property name="city" column="city"></property>
			<property name="area" column="area"></property>
		</component>
		<set name="carSet" table="cars" cascade="all" inverse="true">
			<key column="star_id"></key>
			<one-to-many class="Car"/>
		</set>
	</class>
	<!-- 多的一方关系映射 -->
	<class name="Car" table="cars">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" ></property>
		<property name="price" column="price" ></property>
		<many-to-one name="star" column="stars_id" ></many-to-one>
	</class>
</hibernate-mapping>

最后一步,写测试类StarDao:

package example.component;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import example.utils.HibernateUtils;

public class StarDao {

	/**
	 * 保存1个明星,级联保存N辆汽车
	 */
	@Test
	public void test01(){
		Star star=new Star("刘亦菲","女");
		Address address=new Address("北京","北京","朝阳区");
		star.setAdress(address);
		
		Car c1=new Car("AWE",300);
		Car c2=new Car("BWE",400);
		star.getCarSet().add(c1);
		star.getCarSet().add(c2);
		c1.setStar(star);
		c2.setStar(star);
		Session session=HibernateUtils.getSession();
		Transaction t=session.getTransaction();
		try{
			t.begin();
			session.save(star);
			t.commit();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			t.rollback();
		}finally{
			HibernateUtils.closeSession();
		}
	}
}

执行结果如下:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into stars (name, gender, province, city, area) values (?, ?, ?, ?, ?)
Hibernate: insert into cars (name, price, stars_id) values (?, ?, ?)
Hibernate: insert into cars (name, price, stars_id) values (?, ?, ?)

抱歉!评论已关闭.