组合关系
--体现整体与部分同存同亡
--数据存储到一张表中,提交检索速度
--数据都在一张表中,不存在延迟加载的问题,使用load或get都一样
--一个类持有多个component,字段需取别名以示区分
--体现整体与部分同存同亡
--数据存储到一张表中,提交检索速度
--数据都在一张表中,不存在延迟加载的问题,使用load或get都一样
--一个类持有多个component,字段需取别名以示区分
package org.leadfar.hibernate.model;
public class Person {
private int id;
private String name;
private Address work;
private Address home;
Person() {
}
public Address getWork() {
return work;
}
public void setWork(Address work) {
this.work = work;
}
public Address getHome() {
return home;
}
public void setHome(Address home) {
this.home = home;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package org.leadfar.hibernate.model;
public class Address {
private String province;
private String city;
private String street;
Address(){}
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 getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.auction"> <!-- name为实体类 table为映射到数据库中的表 lazy默认为true 延迟发出select语句,直到真正用到对象的属性(非id属性)--> <class name="org.leadfar.hibernate.model.Person" table="t_person" > <!-- id为数据库标识,作为主键 --> <id name="id"> <generator class="native"/> </id> <property name="name"/> <component name="work" class="org.leadfar.hibernate.model.Address"> <property name="province" column="work_p"/> <property name="city" column="work_c"/> <property name="street" column="work_s"/> </component> <component name="home" class="org.leadfar.hibernate.model.Address"> <property name="province" column="home_p"/> <property name="city" column="home_c"/> <property name="street" column="home_s"/> </component> </class> </hibernate-mapping>
测试
package org.leadfar.hibernate.model;
import junit.framework.TestCase;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Test_Component_01 extends TestCase {
public void testSave_01() throws Exception {
//默认读取类路径根目录下的hibernate.cfg.xml配置文件
Configuration cfg = new Configuration().configure();
//创建SessionFactory
//buildSessionFactory的时候会自动创建数据库表
SessionFactory sfactory = cfg.buildSessionFactory();
//创建Hibernate Session
Session session = sfactory.openSession();
try {
//开启事务
session.beginTransaction();
Person p = new Person();
p.setName("张三");
Address home = new Address();
home.setProvince("四川");
home.setCity("眉山");
home.setStreet("洪雅");
Address work = new Address();
work.setProvince("北京");
work.setCity("北京");
work.setStreet("马家堡");
p.setHome(home);
p.setWork(work);
session.save(p);
//提交事务
session.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
//出现异常,回滚事务
session.getTransaction().rollback();
} finally {
//关闭session
session.close();//session关闭之后,user对象处于离线Detached状态
}
}
public void testLoad_01() throws Exception {
//默认读取类路径根目录下的hibernate.cfg.xml配置文件
Configuration cfg = new Configuration().configure();
//创建SessionFactory
//buildSessionFactory的时候会自动创建数据库表
SessionFactory sfactory = cfg.buildSessionFactory();
//创建Hibernate Session
Session session = sfactory.openSession();
try {
//开启事务
session.beginTransaction();
Person p = (Person)session.load(Person.class, 2);
System.out.println(p.getId()+","+p.getName()+","+p.getWork().getProvince()+","+p.getHome().getProvince());
//提交事务
session.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
//出现异常,回滚事务
session.getTransaction().rollback();
} finally {
//关闭session
session.close();//session关闭之后,user对象处于离线Detached状态
}
}
}