班級和學生兩個實體類,關係以下:java
多對一(many-to-one):多個學生屬於一個班級數據庫
一對多(one-to-many):一個班級有多個學生session
一、班級實體app
package demo.entity; import java.util.HashSet; import java.util.Set; /** * 班級 * @author Don * @date:日期:2017年4月10日 時間:下午4:51:56* * @version 1.0 */ public class Cla { private int id; private String name; private String addr; private Set<Student> stus=new HashSet<Student>(); 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 String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public Set<Student> getStus() { return stus; } public void setStus(Set<Student> stus) { this.stus = stus; } }
映射關係ide
<?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> <!-- name:實體, table:表名 --> <class name="demo.entity.Cla" table="m2o_cla"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator類來生成主鍵 --> <generator class="identity" /> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <property name="addr"/> <!-- inverse:這個屬性(stus) 是否爲關係的維護方,默認值爲false 若是inverse設置爲true,表示將由對方維護二者之間的關聯關係 --> <!--cascade(級聯)意思是指定兩個對象之間的操做聯動關係,對一個對象執行了操做以後,對其指定的級聯對象也須要執行相同的操做 all-表明在全部的狀況下都執行級聯操做 none-在全部狀況下都不執行級聯操做 save-update-在保存和更新的時候執行級聯操做 delete-在刪除的時候執行級聯操做 --> <!--lazy:延遲加載,默認true,如學生實體不調用班級實體信息,能夠不用加載 --> <set name="stus" inverse="false" cascade="all" lazy="true"> <!-- 關係維護方的外鍵列 --> <key column="cid"></key> <one-to-many class="demo.entity.Student" /> </set> </class> </hibernate-mapping>
二、學生實體測試
package demo.entity; /** * 學生信息 * @author Don * @date:日期:2017年4月10日 時間:下午4:50:55* * @version 1.0 */ public class Student { private int id; private String name; private int age; private Cla cla; 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } public Cla getCla() { return cla; } public void setCla(Cla cla) { this.cla = cla; } }
映射關係ui
<?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> <!-- name:實體, table:表名 --> <class name="demo.entity.Student" table="m2o_stu"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator類來生成主鍵 --> <generator class="identity" /> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <property name="age"/> <!-- 對應班級配置中的cid --> <many-to-one name="cla" column="cid" cascade="save-update"></many-to-one> </class> </hibernate-mapping>
三、測試上述配置關係this
獲取Session會話公共方法spa
package demo.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class HibernateUtil { public static Session getCurrentSession() { /* * 兩種配置文件的加載方式,hibernate.properties只配置數據庫的鏈接方式 * 屬性文件(hibernate.properties)調用代碼:Configuration cfg = new * Configuration(); Xml文件(hibernate.cfg.xml) 調用代碼:Configuration cfg = * new Configuration().configure(); */ // 加載Hibernate配置信息,默認讀取src下的hibernate.cfg.xml Configuration cfg = new Configuration().configure(); // 也能夠指定hibernate.cfg.xml 的路徑加載 // Configuration cfg1 = new Configuration().configure(Path); /* * 應用程序從SessionFactory(會話工廠)裏得到Session(會話)實例。它在多個應用線程間進行共享。 * 一般狀況下,整個應用只有惟一的一個會話工廠,SessionFactory由Configuration對象建立, * 每一個Hibernate配置文件,其實是對SessionFactory的配置 */ // 試用配置信息構建sessionFactory SessionFactory factory = cfg.buildSessionFactory(); Session session =factory.getCurrentSession(); return session; } }
3.1保存數據.net
package demo.test; import org.hibernate.classic.Session; import demo.entity.Cla; import demo.entity.Student; import demo.util.HibernateUtil; public class TestSave01 { public static void main(String[] args) { Cla c1 = new Cla(); c1.setName("一班"); c1.setAddr("101"); Student stu1= new Student(); stu1.setName("呂布"); stu1.setAge(36); stu1.setCla(c1); Student stu2= new Student(); stu2.setName("趙雲"); stu2.setCla(c1); //持久化 Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); session.save(c1); //儘可能保存真正的維護方對象,即一對多 由多的維護 session.save(stu1); session.save(stu2); session.getTransaction().commit(); } }
3.2查找數據
package demo.test; import org.hibernate.classic.Session; import demo.entity.Cla; import demo.entity.Student; import demo.util.HibernateUtil; public class TestFind { public static void main(String[] args) { // 持久化 Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); Cla cla =(Cla) session.get(Cla.class, 1); System.out.println("班級名稱:"+cla.getName()); System.out.println("班級地址:"+cla.getAddr()); System.out.println("班級人數:"+cla.getStus().size()); for(Student stu:cla.getStus()) { System.out.println(stu.getName()+":"+stu.getAge()); } session.getTransaction().commit(); } }
3.3刪除數據
package demo.test; import org.hibernate.classic.Session; import demo.entity.Cla; import demo.entity.Student; import demo.util.HibernateUtil; public class TestDelete { /** * @param args */ public static void main(String[] args) { // 持久化 Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); /* *級聯刪除須要先查詢 * */ Cla cla = (Cla)session.get(Cla.class, 1); session.delete(cla); session.getTransaction().commit(); } }