关系映射的1to1
关系映射的1to1
1中是基于外键的一对一
配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <!-- 具体表继承 子类扩展的数据保存在子类表中,继承的数据保存的父类表中 配置实现(如果才ER图上看就是一个一对一关系) 因为子类的数据保存在自己的表中,所以不需要类似 单表继承 辨别列 而是通过一个 主键关联 --> <hibernate-mapping package="bean"> <class name="Address" table="t_address" > <id name="id"><generator class="native"/></id> <property name="descs"/> <property name="code"/> <many-to-one name="person" column = "p_id" unique="true" not-null="true"/> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <!-- 具体表继承 子类扩展的数据保存在子类表中,继承的数据保存的父类表中 配置实现(如果才ER图上看就是一个一对一关系) 因为子类的数据保存在自己的表中,所以不需要类似 单表继承 辨别列 而是通过一个 主键关联 --> <hibernate-mapping package="bean"> <class name="Person" table="t_person" > <id name="id"><generator class="identity"/></id> <property name="name"/> <property name="password"/> <property name="birthday"/> //配置级联操作 <one-to-one name="address" cascade="all"/> </class> </hibernate-mapping>
在这两个配置文件中person是主表,address是字表。
package bean; public class Address { private Integer id; private String descs; private int code; private Person person; public Address(){} public Address(String descs,int code) { this.code = code; this.descs = descs; } @Override public String toString() { return "Address [id=" + id + ", descs=" + descs + ", code=" + code + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDescs() { return descs; } public void setDescs(String descs) { this.descs = descs; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
package bean; import java.util.Date; public class Person { private Integer id; private String name; private int password; private Date birthday; private Address address; public Person(){} public Person(String name,int password,Date birthday) { this.name= name; this.password = password; this.birthday = birthday; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", password=" + password + ", birthday=" + birthday + ", 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 int getPassword() { return password; } public void setPassword(int password) { this.password = password; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
测试的方法
package Test; import java.util.Date; import bean.Address; import bean.Person; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateTest { SessionFactory sessionFactory =null; Session session =null; Transaction tx = null; /** * 初始化测试数据 * @throws Exception */ public void setUp() throws Exception { System.out.println("------setUp---初始化测试资源-----"); Configuration config = new Configuration().configure(); ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); sessionFactory = config.buildSessionFactory(sr); session = sessionFactory.openSession(); } public void testAdd(){ Address p = new Address("郑州",456465); tx = session.beginTransaction(); session.persist(p); tx.commit(); } public void testAdd2(){ Address address = new Address("郑州",456465); Person person = new Person("tiger",123,new Date()); address.setPerson(person); person.setAddress(address); tx = session.beginTransaction(); session.persist(person); session.persist(address); tx.commit(); } public void testGet(){ Person p = (Person)session.get(Person.class, 1); System.out.println(p); } /** * 释放测试数据 * @throws Exception */ public void tearDown() throws Exception { System.out.println("------tearDown---释放测试数据---"); session.close(); sessionFactory.close(); } public static void main(String [] args) throws Exception { HibernateTest h = new HibernateTest(); h.setUp(); h.testAdd2(); h.tearDown(); } }
一对一关联查询的时候,如果是根据主表查找字表的数据就立即查询(一条查询语句就搞定根据左外连接),如果从字表查找主表的数据的时候是延迟查询(两条sql语句,也是左外连接实现
public void testGet() { //通过人获得地址 Person p = (Person)session.get(Person.class, 1); System.out.println(p); System.out.println(p.getAddress()); } @Test public void testGet2() { //通过地址获得人 Address addrss = (Address)session.get(Address.class, 1); System.out.println(addrss); System.out.println(addrss.getPerson()); }
public void testAdd2(){ Address address = new Address("郑州",456465); Person person = new Person("tiger",123,new Date()); address.setPerson(person); //设置了级联操作所以可以不需要再 手动保存 address类了 //person.setAddress(address); tx = session.beginTransaction(); session.persist(person); session.persist(address); tx.commit(); }
)。
基于主键的一对一配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 一对一 主键 双向 关联关系 配置 --> -<hibernate-mapping package="bean"> -<class table="t_person" name="Person"> -<id name="id"> <generator class="identity"/> </id> <property name="name"/> <property name="password"/> <property name="birthday"/> <!-- one-to-one 表示 一对一 配置 cascade 表示级联操作(当保存Person的时候,会一并将配置了关联关系的address保存) all 表示级联操作 save ,update,delete none 表示不进行级联操作(默认值) save-update 表示在进行save和update操作的时候执行级联操作 delete 表示在进行delete操作的时候执行级联操作 --> <one-to-one name="address" cascade="all"/> </class> -<class table="t_address" name="Address"> -<id name="id"> <!-- 表示adderss的主键不再由 自己产生,而是使用Person对应表的主键 --> -<generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="codes"/> <property name="des"/> <!-- 基于 外键 的 一对一 双向 关联 --> <!-- many-to-one name="person" unique="true" column="p_id"/--> <!-- 基于 主键 的 一对一 双向 关联 constrained 表示主键约束 true表示启用主键约束 --> <one-to-one name="person" constrained="true"/> </class> </hibernate-mapping>