Hibernate5-一对多双向关联-左外连接-HQL

1.创建项目,项目名称hibernatedemo18,目录结构如图所示

2.在项目中创建lib目录存储jar文件,目录结构如图所示

3.在src目录中创建实体Bean Forum,包名(com.mycompany.demo.bean),如图所示

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),如图所示

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),如图所示

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),如图所示

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),如图所示

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,如图所示

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),目录结构如图所示

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;

	@Before
	public void init(){
		session = HbnUtil.getSession();
	}

	/*
	 * 一对多双向关联-添加
	 */
	@Test
	public 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
	 */
	@Test
	public void testLeft(){
		try {
			session.beginTransaction();

			String hsql = "FROM Forum f LEFT OUTER JOIN f.forumPosts";

			List<Object[]> list = session.createQuery(hsql).list();
			for (Object[] objects : list) {
				Forum forum = (Forum) objects[0];
				ForumPost forumPost = null;
				if(objects[1] != null){
					forumPost = (ForumPost) objects[1];
					System.out.println(forum.getName() + " : " 
					+ forumPost.getSubject());
				}

			}

			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			e.printStackTrace();
		}
	}
}

时间: 2024-08-04 06:32:51

Hibernate5-一对多双向关联-左外连接-HQL的相关文章

Hibernate5-一对多双向关联-迫切左外连接-HQL

1.创建项目,项目名称hibernatedemo19,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体Bean Forum,包名(com.mycompany.demo.bean),如图所示 4.实体Bean Forum的内容如下 package com.mycompany.demo.bean; import java.util.Set; public class Forum { private int fid; private String

[原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Linq to EF 内连接和左外连接

Linq中连接主要有组连接.内连接.左外连接.交叉连接四种.本文主要讲解没连接和左外连接. 本次使用到的数据实体模型具体的创建方法不再累述.该实体模型中包括Student.Course两个表,他们之间是一对多的关系. 一.内连接 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query = from s in model.Student join c in mode

深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转载)

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.     2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEFT

Hibernate迫切左外连接和迫切内连接

•迫切左外连接: •LEFT JOIN FETCH 关键字表示迫切左外连接检索策略. –list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee  集合都被初始化, 存放所有关联的 Employee 的实体对象. –查询结果中可能会包含重复元素, 可以通过一个 HashSet 来过滤重复元素 •左外连接: –LEFT JOIN 关键字表示左外连接查询. –list() 方法返回的集合中存放的是对象数组类型 –根据配置文件来决定 Employee

Hibernate 一对多双向关联Demo

以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { private long cid; private String cname; private String cdesc; private Set<Student> students; //get和set } //Student .java public class Student implements Se

hibernate一对多双向关联

14.一对多双向关联 1.在多的一方关联一的一方,多的一方直接维护了关系,所以多的一方没有inverse属性,多的一方在保存自己的时候直接保存了外键,效率高. 2.建立关系和保存对象,可以对应两个映射文件,保存多的一方自己对应自己的映射文件,建立关系可以使用一的一方表的inverse属性.这样发出update语句,效率低了.一对多,从多的一方建立关系,效率高. 例子 在student这边保存属性private Classess classess; 在student.hbm.xml文件在<clas

左外连接、右外连接、内连接、全连接的概念

左外连接 LEFT JOIN 或 LEFT OUTER JOIN 结果集包括:左表中所有的行,右表中满足关联条件的行,如果左表中某一行在右表中没有匹配行,右表中对应的列值在结果集中为空 右外连接 RIGHT JOIN 或 RIGHT OUTER JOIN 刚好和左外连接相反 内连接 INNER JOIN 结果集只列出关联表中满足关联条件的行 全连接 FULL JOIN 或 FULL OUTER JOIN 完整外部联接返回左表和右表中的所有行.当某行在另一个表中没有匹配行时,则另一个表的选择列表列

oracle 内连接 左外连接 右外连接的用法,(+)符号用法

1. 内连接很简单 select A.*, B.* from A,B where A.id = B.id select A.*, B.* from A inner join B on A.id = B.id 以上两句是完全等价的 2. 左外连接 select * from emp a left join dept d on a.deptno=d.deptno select * from emp a,dept d where a.deptno=d.deptno(+) 以上两句是完全等价的 3. 右