类的关系
组合关系
一个类中包含了另一个类。这两个类就是组合关系
继承关系
一个类继承一个关系
组件映射
com.cx.component.Car
package com.cx.component; /** * Created by cxspace on 16-8-3. */ public class Car { private int id; private String name; private Wheel wheel; 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; } public Wheel getWheel() { return wheel; } public void setWheel(Wheel wheel) { this.wheel = wheel; } }
com.cx.component.Wheel
package com.cx.component; /** * Created by cxspace on 16-8-3. */ public class Wheel { private int count; private int size; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } }
com/cx/component/Car.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cx.component"> <class name="Car" table="t_car"> <id name="id"> <generator class="native"></generator> </id> <property name="name" length="20"></property> <!--组件映射--> <component name="wheel"> <property name="size"></property> <property name="count"></property> </component> </class> </hibernate-mapping>
测试类
package com.cx.component; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * Created by cxspace on 16-8-3. */ public class Test { private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Car.class) .buildSessionFactory(); } @org.junit.Test public void save(){ Session session = sf.openSession(); session.beginTransaction(); Wheel wheel = new Wheel(); wheel.setCount(2); wheel.setSize(37); Car car = new Car(); car.setName("路虎"); car.setWheel(wheel); session.save(car); session.getTransaction().commit(); session.close(); /* * * Hibernate: insert into t_car (name, size, count) values (?, ?, ?) * */ } }
继承映射
一.简单的继承映射实例
com.cx.extend1.Animal
package com.cx.extend1; /** * Created by cxspace on 16-8-4. */ public class Animal { private int id; private String name; 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; } }
com.cx.extend1.Cat
package com.cx.extend1; /** * Created by cxspace on 16-8-4. */ public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } }
com/cx/extend1/Cat.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cx.extend1"> <class name="Cat" table="t_Cat"> <!--父类属性直接写,每个对象写一个映射文件--> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <property name="catchMouse"></property> </class> </hibernate-mapping>
com.cx.extend1.Test
package com.cx.extend1; import org.apache.jasper.tagplugins.jstl.core.Catch; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import java.util.List; /** * Created by cxspace on 16-8-4. */ public class Test { private static SessionFactory sf; static { sf = new Configuration().configure().addClass(Cat.class).buildSessionFactory(); } @org.junit.Test public void save(){ Session session = sf.openSession(); session.beginTransaction(); // Cat cat = new Cat(); // cat.setName("大花猫"); // cat.setCatchMouse("抓老鼠"); // session.save(cat); /* * Hibernate: insert into t_Cat (name, catchMouse) values (?, ?) * * * */ /* 当用hql查询的时候,通过父类查询必须写上类的全名 */ Query q = session.createQuery("from com.cx.extend1.Animal"); List<Animal> list = q.list(); System.out.println(list); /* * * Hibernate: select cat0_.id as id0_, cat0_.name as name0_, cat0_.catchMouse as catchMouse0_ from t_Cat cat0_ [com.cx.extend1.Cat@3c947bc5] * * */ session.getTransaction().commit(); session.close(); } }
二.所有的子类都映射到一张表实例
com.cx.extend2.Animal
package com.cx.extend2; /** * Created by cxspace on 16-8-4. */ public class Animal { private int id; private String name; 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; } }
com.cx.extend2.Cat
package com.cx.extend2; /** * Created by cxspace on 16-8-4. */ public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } }
com.cx.extend2.Monkey
package com.cx.extend2; /** * Created by cxspace on 16-8-4. */ public class Monkey extends Animal{ // 吃香蕉 private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } }
com/cx/extend2/Animal.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 继承映射-所有的子类都映射到一张表 --> <hibernate-mapping package="com.cx.extend2"> <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"></generator> </id> <!--指定鉴别器字段(用来区分不同的子类)--> <discriminator column="type_"></discriminator> <property name="name"></property> <!-- 子类:猫 每个子类都要用subclass节点映射 一定要指定鉴别器字段,否则报错! 鉴别器字段 discriminator-value="cat_" 指定总表鉴别器字段的值 --> <subclass name="Cat" discriminator-value="cat_"> <property name="catchMouse"></property> </subclass> <!-- 猴子子类 --> <subclass name="Monkey" discriminator-value="monkey_"> <property name="eatBanana"></property> </subclass> </class> </hibernate-mapping>
com.cx.extend2.Test
package com.cx.extend2; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * Created by cxspace on 16-8-4. */ public class Test { private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Animal.class) .buildSessionFactory(); } @org.junit.Test public void save(){ Session session = sf.openSession(); session.beginTransaction(); Cat cat = new Cat(); cat.setName("大话猫"); cat.setCatchMouse("抓老鼠"); Monkey m = new Monkey(); m.setName("猴子"); m.setEatBanana("吃香蕉"); session.save(cat); session.save(m); /* * * * Hibernate: insert into t_animal (name, catchMouse, type_) values (?, ?, 'cat_') Hibernate: insert into t_animal (name, eatBanana, type_) values (?, ?, 'monkey_') * * * */ session.getTransaction().commit(); session.close(); } }
三.一个对象映射一张表
实体类
package com.cx.extend3; /** * Created by cxspace on 16-8-4. */ public class Animal { private int id; private String name; 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 com.cx.extend3; /** * Created by cxspace on 16-8-4. */ public class Cat extends Animal{ // 抓老鼠 private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } } package com.cx.extend3; /** * Created by cxspace on 16-8-4. */ public class Monkey extends Animal{ // 吃香蕉 private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } }
映射配置
com/cx/extend3/Animal.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 继承映射-每个类对应一张表(父类也要对应表) --> <hibernate-mapping package="com.cx.extend3"> <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- 子类-猫对应表t_cat key 指定t_cat表的外键字段 --> <joined-subclass name="Cat" table="t_cat"> <key column="t_animal_id"></key> <property name="catchMouse"></property> </joined-subclass> <joined-subclass name="Monkey" table="t_monkey"> <key column="t_animal_id"></key> <property name="eatBanana"></property> </joined-subclass> </class> </hibernate-mapping>
测试
package com.cx.extend3; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * Created by cxspace on 16-8-4. */ public class Test { private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Animal.class) .buildSessionFactory(); } @org.junit.Test public void save(){ Session session = sf.openSession(); session.beginTransaction(); // 保存 Cat cat = new Cat(); cat.setName("大花猫"); cat.setCatchMouse("抓老鼠"); Monkey m = new Monkey(); m.setName("猴子"); m.setEatBanana("吃香蕉"); // 保存 session.save(cat); session.save(m); /* * * 4条sql Hibernate: insert into t_animal (name) values (?) Hibernate: insert into t_cat (catchMouse, t_animal_id) values (?, ?) Hibernate: insert into t_animal (name) values (?) Hibernate: insert into t_monkey (eatBanana, t_animal_id) values (?, ?) * * */ session.getTransaction().commit(); session.close(); } }
结果
四.继承映射-每个类对应一张表(父类不对应表)
实体类
package com.cx.extend4; public class Animal { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package com.cx.extend4; public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } } package com.cx.extend4; public class Monkey extends Animal { private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } }
映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 继承映射-每个类对应一张表(父类不对应表) --> <!-- abstract="true" 指定实体类对象不对应表 --> <hibernate-mapping package="com.cx.extend4"> <class name="Animal" abstract="true"> <!--如果用union-subclass节点,主键生成策略不能为自增长!--> <id name="id"> <generator class="uuid"></generator> </id> <property name="name"></property> <!-- union-subclass table指定未表名 表的主键即为id列 --> <union-subclass name="Cat" table="t_cat"> <property name="catchMouse"></property> </union-subclass> <union-subclass name="Monkey" table="t_monkey"> <property name="eatBanana"></property> </union-subclass> </class> </hibernate-mapping>
测试
package com.cx.extend4; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * Created by cxspace on 16-8-4. */ public class Test { private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Animal.class) .buildSessionFactory(); } @org.junit.Test public void Save() { Session session = sf.openSession(); session.beginTransaction(); // 保存 Cat cat = new Cat(); cat.setName("大花猫"); cat.setCatchMouse("抓大老鼠"); Monkey m = new Monkey(); m.setName("猴子"); m.setEatBanana("吃香蕉"); // 保存 session.save(cat); session.save(m); session.getTransaction().commit(); session.close(); } /* * * Hibernate: insert into t_cat (name, catchMouse, id) values (?, ?, ?) Hibernate: insert into t_monkey (name, eatBanana, id) values (?, ?, ?) * * * * */ }