1.组件:component(一个表)
(1)
public class Student { private String id; private String name; private Address address;
public class Address { private String homeAddress; private String schoolAddress;
<hibernate-mapping > <class name="com.liule.hibernate.Student" table="student"> <id name="id" column="id" type="string" > <generator class="uuid"></generator> <!-- 主键生成方式 --> </id> <property name="name" type="string"> <column name="name" length="50"></column> </property> <component name="address" class="com.liule.hibernate.Address"> <property name="homeAddress" type="string"></property> <property name="schoolAddress" type="string"></property> </component> </class> </hibernate-mapping>
插入信息:
public static void main(String[] args) { Student student1 = new Student(); student1.setName("sad"); Address ad = new Address(); ad.setHomeAddress("shanghai"); ad.setSchoolAddress("guangzhou"); student1.setAddress(ad); Session session = sf.openSession(); Transaction tx = null; try {
(2)集合类型的组件,本质上于one-to-many相同(不推荐使用)
public class Contact { private String student_id; //新增加的 private String method; private String address;
public class Student { private String id; private String name; private Set contacts = new HashSet();
<hibernate-mapping> <class name="com.liule.hibernate.Student" table="Student"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> <!-- 生成32位的字符串 --> </id> <property name="name" column="name" type="string"></property> <set name="contacts" table="contacts"> <key column="student_id"></key> <composite-element class="com.liule.hibernate.Contact"> <!-- class为组合元素的类的类型 --> <property name="address" type="string"></property> <property name="method" type="string"></property> </composite-element> </set> </class> </hibernate-mapping>
生成的表:
2.继承映射(三种方式)
(1)每个子类一张表
public class Person { private String id; private String name;
public class Student extends Person { private String cardId;
public class Teacher { private String salary;
<hibernate-mapping> <class name="com.liule.hibernate.Student" table="Student"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> <!-- 生成32位的字符串 --> </id> <property name="name" column="name" type="string"></property><!-- 通过get、set方法获得父类的属性 --> <property name="cardId" column="cardId" type="string"></property> </class> </hibernate-mapping>
<hibernate-mapping> <class name="com.liule.hibernate.Teacher" table="Teacher"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> <!-- 生成32位的字符串 --> </id> <property name="name" column="name" type="string"></property><!-- 通过get、set方法获得父类的属性 --> <property name="salary" column="salary" type="string"></property> </class> </hibernate-mapping
数据的查询:
public static void main(String[] args) { Session session = sf.openSession(); Transaction ts = null; try { Query query = session.createQuery("from com.liule.hibernate.Person");//多态查询,会将Person内的子类的记录都查询出来. //若父类没有hbm文件,必须填写完整的包名 java.util.Iterator it =query.iterate(); while(it.hasNext()) { Person person = (Person)it.next(); System.out.println(person.getName()); } ts = session.beginTransaction(); ts.commit(); } catch(Exception ex) {
(2)一张表存储继承体系中所有类的信息(数据库表实际上是继承体系中所有类的属性的并集所构成的字段。)(一张表对应一个hbm文件)
public class Person { private String id; private String name;
public class Teacher extends Person { private String salary;
public class Student extends Person { private String cardId;
<hibernate-mapping> <class name="com.liule.hibernate.Person" table="person"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> <!-- 生成32位的字符串 --> </id> <!-- 用于区分student、teacher的列 --> <discriminator column="personType" type="string" ></discriminator> <property name="name" column="name" type="string"></property><!-- 通过get、set方法获得父类的属性 --> <subclass name="com.liule.hibernate.Student" discriminator-value="student"> <property name="cardId" type="string"></property> </subclass> <subclass name="com.liule.hibernate.Teacher" discriminator-value="teacher"> <property name="salary" type="string"></property> </subclass> </class> </hibernate-mapping>
(3)公共信息放在父类表中,独有信息放在子类,每个子类对应一张表
<hibernate-mapping> <class name="com.liule.hibernate.Person" table="person"> <id name="id" column="id" type="string"> <generator class="uuid"></generator> <!-- 生成32位的字符串 --> </id> <!-- 用于区分student、teacher的列 --> <property name="name" column="name" type="string"></property><!-- 通过get、set方法获得父类的属性 --> <joined-subclass name="com.liule.hibernate.Student" table="student"> <key column="id"></key> <property name="cardId" type="string"></property> </joined-subclass> <joined-subclass name="com.liule.hibernate.Teacher" table="teacher"> <key column="id"></key> <property name="salary" type="string"></property> </joined-subclass> </class> </hibernate-mapping>