標籤:hibernate5-一對多雙向關聯-迫切左外串連-hql
1.建立項目,項目名稱hibernatedemo19,目錄結構
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/8F/6B/wKioL1jd8N7Ak-HgAAAikE-tcMI024.png-wh_500x0-wm_3-wmp_4-s_2248312027.png" title="QQ20170331140115.png" alt="wKioL1jd8N7Ak-HgAAAikE-tcMI024.png-wh_50" />
2.在項目中建立lib目錄存放jar檔案,目錄結構
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M01/8F/6E/wKiom1jd8QjSQbnLAABdd-lR0OE413.png-wh_500x0-wm_3-wmp_4-s_3759094861.png" title="QQ20170331140157.png" alt="wKiom1jd8QjSQbnLAABdd-lR0OE413.png-wh_50" />
3.在src目錄中建立實體Bean Forum,包名(com.mycompany.demo.bean),
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/8F/6C/wKioL1jd8XixOTRRAAA62crPwog588.png-wh_500x0-wm_3-wmp_4-s_459237390.png" title="QQ20170331140350.png" alt="wKioL1jd8XixOTRRAAA62crPwog588.png-wh_50" />
4.實體Bean Forum的內容如下
package com.mycompany.demo.bean;import java.util.Set;public class Forum {private int fid;private String name;private Set<ForumPost> forumPosts;public int getFid() {return fid;}public void setFid(int fid) {this.fid = fid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<ForumPost> getForumPosts() {return forumPosts;}public void setForumPosts(Set<ForumPost> forumPosts) {this.forumPosts = forumPosts;}}
5.在src目錄中建立實體Bean Forum的對應檔Forum.hbm.xml,包名(com.mycompany.demo.bean),
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M01/8F/6E/wKiom1jd8bDzZfNbAAA9XNEnIHE626.png-wh_500x0-wm_3-wmp_4-s_2964243332.png" title="QQ20170331140445.png" alt="wKiom1jd8bDzZfNbAAA9XNEnIHE626.png-wh_50" />
6.對應檔Forum.hbm.xml的內容如下
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--package:指定<class/>所在的包 --><hibernate-mapping package="com.mycompany.demo.bean"><!--name:類名table:表名 catalog:資料庫名稱,預設為hibernate.cfg.xml中配置的資料庫名稱 --> <class name="Forum" table="forum"> <meta attribute="class-description"> This class contains the forum detail. </meta> <!-- name:屬性名稱 colum:列名 --> <id name="fid" type="int" column="fid"> <!-- increment:hibernate維護主索引值 identity:資料庫自增長 sequence:序列 native:根據不同的資料庫選擇建置原則 uuid:通過UUID演算法產生,實際使用較多 assigned:手工設定 --> <generator class="native"/> </id> <!-- length:位元組長度 type:欄位類型,支援java和hibernate類型 not-null:非空約束 unique:唯一性限制式 --> <property name="name" column="name" /> <set name="forumPosts" cascade="all"> <key column="fid"/> <one-to-many class="ForumPost"/> </set> </class></hibernate-mapping>
7.在src目錄中建立實體Bean ForumPost,包名(com.mycompany.demo.bean),
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M01/8F/6C/wKioL1jd8ezDzRlDAAA8xFFb7XM914.png-wh_500x0-wm_3-wmp_4-s_1615069622.png" title="QQ20170331140545.png" alt="wKioL1jd8ezDzRlDAAA8xFFb7XM914.png-wh_50" />
8.實體Bean ForumPost的內容如下
package com.mycompany.demo.bean;public class ForumPost {private int pid;private String subject;private Forum forum;public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public Forum getForum() {return forum;}public void setForum(Forum forum) {this.forum = forum;}}
9.在src目錄中建立實體Bean ForumPost的對應檔ForumPost.hbm.xml,包名(com.mycompany.demo.bean),
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M01/8F/6C/wKioL1jd8iHSVEYmAAA8t0MPN3A312.png-wh_500x0-wm_3-wmp_4-s_2905968684.png" title="QQ20170331140639.png" alt="wKioL1jd8iHSVEYmAAA8t0MPN3A312.png-wh_50" />
10.對應檔ForumPost.hbm.xml的內容如下
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--package:指定<class/>所在的包 --><hibernate-mapping package="com.mycompany.demo.bean"><!--name:類名table:表名 catalog:資料庫名稱,預設為hibernate.cfg.xml中配置的資料庫名稱 --> <class name="ForumPost" table="forumpost"> <meta attribute="class-description"> This class contains the forumpost detail. </meta> <!-- name:屬性名稱 colum:列名 --> <id name="pid" type="int" column="pid"> <!-- increment:hibernate維護主索引值 identity:資料庫自增長 sequence:序列 native:根據不同的資料庫選擇建置原則 uuid:通過UUID演算法產生,實際使用較多 assigned:手工設定 --> <generator class="native"/> </id> <!-- length:位元組長度 type:欄位類型,支援java和hibernate類型 not-null:非空約束 unique:唯一性限制式 --> <property name="subject" column="subject" type="string" length="50" not-null="true" unique="false"/> <!-- name:關聯屬性 column:關聯屬性在資料庫對應的欄位 class:關聯屬性所對應的類型 --> <many-to-one name="forum" class="Forum" column="fid"/> </class></hibernate-mapping>
11.在src目錄中建立工具類 HbnUtil,包名(com.mycompany.demo.util),
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M01/8F/6C/wKioL1jd8laSpDrNAAAwQGoRfyo093.png-wh_500x0-wm_3-wmp_4-s_1884818975.png" title="QQ20170331140732.png" alt="wKioL1jd8laSpDrNAAAwQGoRfyo093.png-wh_50" />
12.工具類 HbnUtil的內容如下
package com.mycompany.demo.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HbnUtil {private static SessionFactory sessionFactory;public static Session getSession(){if(sessionFactory == null || sessionFactory.isClosed()){sessionFactory = new Configuration().configure().buildSessionFactory();}return sessionFactory.getCurrentSession();}}
13.在src目錄中建立Hibernate的設定檔hibernate.cfg.xml,
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M00/8F/6E/wKiom1jd8oazgYhyAAAsKhqqIlg431.png-wh_500x0-wm_3-wmp_4-s_107239864.png" title="QQ20170331140820.png" alt="wKiom1jd8oazgYhyAAAsKhqqIlg431.png-wh_50" />
14.Hibernate的設定檔hibernate.cfg.xml的內容如下
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 方言,可以從Hibernate核心jar(hibernate-core-x.x.x.Finall.jar) 檔案中的or.hibernate.dialect包中找到相應的類,類的全名就是 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 驅動 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 資料庫連接地址 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- 使用者名稱 --> <property name="hibernate.connection.username"> root </property> <!-- 密碼 --> <property name="hibernate.connection.password"></property> <!-- create:每次都新建立,如果存在就刪除 create-drop:建立新表,sessionFactory關閉,表會刪除 update :表欄位增加,會同步,欄位減少不同步,資料改變會同步修改 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 輸出sql --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- 事務環境一個線程對一個事務 thread:本地事務環境 jta:分散式交易環境 SpringSessionContext:用於ssh整合 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 使用c3p0資料來源 --> <property name="hibernate.connection.provider_class"> org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <!-- List of XML mapping files --> <mapping resource="com/mycompany/demo/bean/Forum.hbm.xml"/> <mapping resource="com/mycompany/demo/bean/ForumPost.hbm.xml"/></session-factory></hibernate-configuration>
15.在項目中建立test目錄存放測試檔案,檔案名稱TestApp,包名(com.mycompany.demo.bean),目錄結構
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/8F/6C/wKioL1jd8rzQQnOoAAAo8ScEZtI176.png-wh_500x0-wm_3-wmp_4-s_1749370225.png" title="QQ20170331140913.png" alt="wKioL1jd8rzQQnOoAAAo8ScEZtI176.png-wh_50" />
16.TestApp測試類別的內容如下
package com.mycompany.demo.bean;import java.util.HashSet;import java.util.List;import java.util.Set;import org.hibernate.Session;import org.junit.Before;import org.junit.Test;import com.mycompany.demo.util.HbnUtil;public class TestApp {private Session session;@Beforepublic void init(){session = HbnUtil.getSession();}/* * 一對多雙向關聯-添加 */@Testpublic void testOneToManyAdd(){try {session.beginTransaction();ForumPost forumPost1 = new ForumPost();forumPost1.setSubject("A");ForumPost forumPost2 = new ForumPost();forumPost2.setSubject("B");Set<ForumPost> forumPosts = new HashSet<ForumPost>();forumPosts.add(forumPost1);forumPosts.add(forumPost2);Forum forum = new Forum();forum.setName("foruma");forum.setForumPosts(forumPosts);session.save(forum);session.getTransaction().commit();} catch (Exception e) {session.getTransaction().rollback();e.printStackTrace();}}/* * 一對多雙向關聯-迫切左外串連-HQL */@Testpublic void testLeft(){try {session.beginTransaction();String hsql = "FROM Forum f LEFT OUTER JOIN FETCH f.forumPosts";List<Forum> list = session.createQuery(hsql).list();for (Forum forum : list) {System.out.println(forum.getName());}session.getTransaction().commit();} catch (Exception e) {session.getTransaction().rollback();e.printStackTrace();}}/* * 一對多雙向關聯-迫切左外串連-去重複-HQL */@Testpublic void testLeftFetch(){try {session.beginTransaction();String hsql = "SELECT distinct f FROM Forum f LEFT OUTER JOIN FETCH f.forumPosts";List<Forum> list = session.createQuery(hsql).list();for (Forum forum : list) {System.out.println(forum.getName());}session.getTransaction().commit();} catch (Exception e) {session.getTransaction().rollback();e.printStackTrace();}}}
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M02/8F/6E/wKiom1jd8uWSnC31AABwCKMO5XE263.png-wh_500x0-wm_3-wmp_4-s_1801566037.png" title="QQ20170324102905.png" alt="wKiom1jd8uWSnC31AABwCKMO5XE263.png-wh_50" />
本文出自 “素顏” 部落格,謝絕轉載!
Hibernate5-一對多雙向關聯-迫切左外串連-HQL