hibernate<7>承袭关系映射
hibernate<7>----继承关系映射
Department.java
Employee.java
Sales.java
Skiller.java
Department.hbm.xml
Employee.hbm.xml 子类和父类在一张表中
Employee.hbm.xml 子类的部分在父类的表中,但子类有自己的表
Employee.hbm.xml 一个子类的部分在父类的表中,一个子类的全部在父类中
Employee.hbm.xml 子类和父类都在单独的表中
hibernate.cfg.xml
HibernateUtil.java
Extends.java
Department.java
package cn.anycall.hibernate.domain; import java.util.Set; public class Department { private int id; private String name; private Set<Employee> emp; public Set<Employee> getEmp() { return emp; } public void setEmp(Set<Employee> emp) { this.emp = emp; } 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; } }
Employee.java
package cn.anycall.hibernate.domain; public class Employee { private int id; private String name; private Department depart; 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 Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } }
Sales.java
package cn.anycall.hibernate.domain; public class Sales extends Employee { private int sell; public int getSell() { return sell; } public void setSell(int sell) { this.sell = sell; } }
Skiller.java
package cn.anycall.hibernate.domain; public class Skiller extends Employee { private String skill; public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } }
Department.hbm.xml
<?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="cn.anycall.hibernate.domain"> <class name="Department" > <id name="id" column="id"> <generator class="native"/> </id> <property name="name"/> <set name="emp" inverse="true"> <key column="depart_id"></key> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
Employee.hbm.xml 子类和父类在一张表中
<?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="cn.anycall.hibernate.domain" > <class name="Employee" discriminator-value="0"> <id name="id" column="id"> <generator class="native"/> </id> <discriminator column="type" type="int"/> <property name="name"/> <many-to-one name="depart" column="depart_id" /> <subclass name="Skiller" discriminator-value="1"> <property name="skill"/> </subclass> <subclass name="Sales" discriminator-value="2"> <property name="sell"/> </subclass> </class> </hibernate-mapping>
Employee.hbm.xml 子类的部分在父类的表中,但子类有自己的表
<?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="cn.anycall.hibernate.domain" > <class name="Employee"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="depart" column="depart_id" /> <joined-subclass name="Skiller" table="skill"> <key column="emp_id"></key> <property name="skill"></property> </joined-subclass> <joined-subclass name="Sales" table="sales"> <key column="emp_id"></key> <property name="sell"></property> </joined-subclass> </class> </hibernate-mapping>
Employee.hbm.xml 一个子类的部分在父类的表中,一个子类的全部在父类中
<?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="cn.anycall.hibernate.domain" > <class name="Employee" discriminator-value="0"> <id name="id" column="id"> <generator class="native"/> </id> <discriminator column="type"/> <property name="name"/> <many-to-one name="depart" column="depart_id" /> <subclass name="Skiller" discriminator-value="1"> <property name="skill"></property> </subclass> <subclass name="Sales" discriminator-value="2"> <join table="sales"> <key column="emp_id"></key> <property name="sell"></property> </join> </subclass> </class> </hibernate-mapping>
Employee.hbm.xml 子类和父类都在单独的表中
<?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="cn.anycall.hibernate.domain" > <class name="Employee"> <id name="id" column="id"> <generator class="hilo"/> </id> <property name="name"/> <many-to-one name="depart" column="depart_id" /> <union-subclass name="Skiller" table="skiller"> <property name="skill"></property> </union-subclass> <union-subclass name="Sales" table="Sales"> <property name="sell"></property> </union-subclass> </class> </hibernate-mapping>
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hbm2ddl.auto">update</property> <property name="show_sql">true</property> <mapping resource="cn/anycall/hibernate/domain/Department.hbm.xml"/> <mapping resource="cn/anycall/hibernate/domain/Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
HibernateUtil.java
package cn.anycall.hibernate; import java.io.Serializable; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public final class HibernateUtil { private static SessionFactory sessionFactory; public static SessionFactory getSessionFactory() { return sessionFactory; } public static void setSessionFactory(SessionFactory sessionFactory) { HibernateUtil.sessionFactory = sessionFactory; } private HibernateUtil(){ } public static Session getSession(){ return getSessionFactory().openSession(); } static{ Configuration cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } public static void add(Object entity){ Session s = null; Transaction tx = null; try{ s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(entity); tx.commit(); }finally{ if(s !=null) s.close(); } } public static void update(Object entity){ Session s = null; Transaction tx = null; try{ s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.update(entity); tx.commit(); }finally{ if(s !=null) s.close(); } } public static void delete(Object entity){ Session s = null; Transaction tx = null; try{ s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.delete(entity); tx.commit(); }finally{ if(s !=null) s.close(); } } public static Object get(Class clazz, Serializable id){ Session s = null; try{ s = HibernateUtil.getSession(); Object obj = s.get(clazz, id); return obj; }finally{ if(s !=null) s.close(); } } }
Extends.java
package cn.anycall.hibernate; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import cn.anycall.hibernate.domain.Department; import cn.anycall.hibernate.domain.Employee; import cn.anycall.hibernate.domain.Sales; import cn.anycall.hibernate.domain.Skiller; public class Extends { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Department depart = add(); query(3); } static Department add(){ Session s = null; Transaction tx = null; try{ s = HibernateUtil.getSession(); tx = s.beginTransaction(); Department depart = new Department(); depart.setName("depart name"); Employee emp = new Employee(); emp.setDepart(depart); emp.setName("employee name"); Skiller sk = new Skiller(); sk.setDepart(depart); sk.setName("employee skill"); sk.setSkill("skill"); Sales sa = new Sales(); sa.setDepart(depart); sa.setName("employee sales"); sa.setSell(2); Set<Employee> set = new HashSet<Employee>(); set.add(sa); set.add(emp); set.add(sk); depart.setEmp(set); s.save(emp); s.save(sa); s.save(sk); s.save(depart); tx.commit(); System.out.println("end"); return depart; }finally{ if(s!=null) s.close(); } } static void query(int id){ Session s = null; try{ s = HibernateUtil.getSession(); Employee em = (Employee) s.get(Employee.class, id); System.out.println("end"); System.out.println(em.getClass()); //Hibernate.initialize(depart.getEmp()); }finally{ if(s!=null) s.close(); } } }