前面咱們已經學過hibernate的基礎,學會增刪改查簡單的操做,然而咱們數據庫中存在着1對多,多對1,多對多的關係,hibernate又是基於ORM基礎上的開源框架,能夠讓咱們不用去編寫SQL語句,它會自動生成,mybatis也是基於ORM基礎上的開源框架,只不過須要咱們編寫sql語句,算是一個半自動的orm吧,今天講解的主要是1對多的映射關係。java
1.一、建立項目mysql
這裏使用到的是組和用戶的關係,1個組能夠有多個用戶。Group和User(這裏筆者說個題外話,注意注意:映射文件中table的名字必定不能是mysql的關鍵字,筆者就是使用了Group,一直報sql語法錯誤,後來才發現原來Group是關鍵字)sql
新建實體類:User.java數據庫
package com.hibernate.one_manys; public class User { private int uid; private String uname; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public User(String uname) { this.uname=uname; } }
新建實體類:Group.java,其中添加User的集合,表示一個組中存在多個用戶,使用集合表示session
package com.hibernate.one_manys; import java.util.HashSet; import java.util.Set; public class Group { private int gid; private String gtitle; private Set<User> users = new HashSet<User>(); public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } public int getGid() { return gid; } public void setGid(int gid) { this.gid = gid; } public String getGtitle() { return gtitle; } public void setGtitle(String gtitle) { this.gtitle = gtitle; } }
新建User的配置文件:User.hbm.xmlmybatis
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.one_manys.User" table="USER"> <id name="uid" type="int"> <column name="UID"></column> <generator class="native"></generator> </id> <property name="uname" column="UNAME"></property> </class> </hibernate-mapping>
新建Group的配置文件:Group.hbm.xmlapp
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 注意點:Group是mysql中的關鍵字,若是使用會報語句錯誤 --> <!-- native:根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。 --> <class name="com.hibernate.one_manys.Group" table="Groups"> <id name="gid" type="int"> <column name="GID"/> <generator class="native"/> </id> <property name="gtitle" type="java.lang.String"> <column name="GTITLE"/> </property> <!-- cascade:級聯操做 all : 全部狀況下均進行關聯操做。 none:全部狀況下均不進行關聯操做。這是默認值。 save-update:在執行save/update/saveOrUpdate時進行關聯操做。 delete:在執行delete時進行關聯操做 --> <set name="users" table="User" cascade="delete"> <!-- column:指明瞭在User表裏有一個gid的列名,是指向Group表的外鍵 --> <key column="gid"/> <!-- 一對多的映射 --> <one-to-many class="com.hibernate.one_manys.User"/> </set> </class> </hibernate-mapping>
注意:這裏使用到cascade級聯操做,顧名思義,就是你執行增刪改查的時候會觸發另外一張表,簡單說來就是,當你主表執行刪除時,從表也會隨之刪除。框架
接下來編寫測試類:ide
package com.hibernate.one_manys; 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; /** * 簡單的1對多的的數據關係,使用到的表有:Groups(注意點:Group是數據庫中的關鍵字),User,其中Groups是一,User是多 * 使用到的類:Group,User;配置文件:Group.xml,User.xml * 步驟: * 一、新建實體類Group和User * 二、新建映射文件Group.hbm.xml和User.hbm.xml * 三、在配置文件hibernate.cfg.xml配置文件中聲明映射文件 * 四、新建測試類測試功能模塊 * 注意點: * 一、在映射文件中定義映射的表不能是關鍵字,其中Group是關鍵字,因此一直報語法錯誤 * */ public class Test_1 { private static SessionFactory sessionfactory; private static Session session; public static void main(String[] args){ //配置 Configuration config = new Configuration().configure(); //註冊服務 ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()) .buildServiceRegistry(); //實例化sessionfactory工廠 sessionfactory = config.buildSessionFactory(service); //打開一個session session = sessionfactory.openSession(); //添加 add(); //查詢 sel(); //修改 //update(); //刪除 del(); } //添加語句 public static void add(){ Transaction transaction = session.beginTransaction(); Group g = new Group(); g.setGtitle("學生會"); User u = new User("張三"); User u1 = new User("李四"); g.getUsers().add(u); g.getUsers().add(u1); //注意點:須要保存組的對象 session.save(g); session.save(u); session.save(u1); transaction.commit(); } //查詢語句 public static void sel(){ Group g = (Group) session.get(Group.class, 1); System.out.println(g.getGtitle()+","+g.getUsers().size()); for(User u: g.getUsers()){ System.out.println(u.getUname()); } } //修改語句 public static void update(){ Group g = (Group)session.get(Group.class,1); g.setGtitle("技術會"); for(User u : g.getUsers()){ if(u.getUname().equals("張三")){ u.setUname("陳凱輝"); g.getUsers().add(u); } } Transaction transaction = session.beginTransaction(); session.save(g); transaction.commit(); } //刪除語句 //注意級聯事件 public static void del(){ Group g = (Group)session.get(Group.class, 1); Transaction transaction = session.beginTransaction(); session.delete(g); transaction.commit(); } }
效果圖爲:測試
總結: