上一篇介绍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 (?, ?, ?)