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

来源:互联网 发布:回收站恢复软件 编辑:程序博客网 时间:2024/05/16 16:10

上一篇介绍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.MySQLMyISAMDialecthibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql://127.0.0.1:3306/example_dbhibernate.connection.username=roothibernate.connection.password=04010hibernate.show_sql=truehibernate.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辆汽车 */@Testpublic 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 exceptione.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 (?, ?, ?)


0 0
原创粉丝点击