SSH学习四 Hibernate多对一的关系 + 增删改查

多对一关系实现起来不难,只需要在“多”的一方声明外键,声明外键在类的映射文件实现。

下面以老师学生为例,老师是1,学生是多

有一个有趣的地方,在Student类里面,没有声明teacherid这个属性,但是只要在配置文件声明了外键,那么就算类里面没有外键,配置文件的property也没有teacherid

下面是几个关键文件:

1、Student类(包含Student的增删改查)

package com.learn.po;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.ehr.dao.HibernateUtil;

public class Student {
	private int sid;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	private String nm;
	private Teacher teacher;
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}

	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	public static void addStudent(){
		//这里的逻辑是,Teacher类的对象是Student的成员函数,向Student表插入数据的时候,
		//初始化Student,需要用Teacher对象,比如加小沈阳需要他的老师赵本上,所以先查找到赵本山,然后才能插入小沈阳,
		//至于外键,是Hibernate自动维护的
		Session session = HibernateUtil.getSessionFactory().openSession();
		Teacher t = (Teacher)session.get(Teacher.class, 2);
		Student s = new Student();
		s.setNm("fanwei");
		s.setTeacher(t);
		HibernateUtil.addObject(s);
		session.close();
	}

	public static void getQuery(int id){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Student s = (Student)session.get(Student.class, 1);
		/*找teacherid根本不进行查询,因为是外键,还在缓存存着*/
		System.out.println(s.getTeacher().getTeacherid());
		/*这里会在自动生成的Hibernate的sql语句会做内连接查询找到name*/
		System.out.println(s.getTeacher().getNm());
	}

	public static void changeTeacher(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Teacher t = (Teacher)session.get(Teacher.class, 3);
		Student s = (Student)session.get(Student.class, 1);
		s.setTeacher(t);
		session.beginTransaction().commit();
	}

	public static void deleteStu(){
		Session session = HibernateUtil.getSessionFactory().openSession();

		Student s = new Student();
		s.setSid(2);
		session.delete(s);
		session.beginTransaction().commit();
	}

	public static void main(String[] args) {
		//addStudent();
		//getQuery(1);
		//changeTeacher();
		//deleteStu();
	}
}

2、Student的映射文件

<?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="com.learn.po">
		<class name="Student" table="student" lazy="true">
			<id name="sid" >
				<generator class="identity"></generator>
			</id>
			<property name="nm"></property>

			<many-to-one fetch="join" name="teacher"  class="Teacher" column="teacherid"></many-to-one>
		</class>
	</hibernate-mapping>

3、Teacher的类

package com.learn.po;

import org.hibernate.Session;

import com.ehr.dao.HibernateUtil;

public class Teacher {
	private int teacherid;
	private String nm;
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}
	public int getTeacherid() {
		return teacherid;
	}
	public void setTeacherid(int teacherid) {
		this.teacherid = teacherid;
	}

	public static void addTeacher(){
		Teacher t = new Teacher();
		t.setNm("te1");
		//这里很神奇,是优Hibernate识别出来是什么类,然后插入相应的表
		HibernateUtil.addObject(t);
		t.setNm("te2");
		HibernateUtil.addObject(t);
	}

	public static void  main(String args[]){

		<pre name="code" class="java"><span style="white-space:pre">		</span>addTeacher();

}}


4、Teacher的映射文件

<?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="com.learn.po">

	<class name="Teacher" table="teacher" lazy="true">
		<id name="teacherid">
			<generator class="identity"></generator>
		</id>
		<property name="nm"></property>
	</class>
</hibernate-mapping>

5、Hibernate配置文件

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory name="foo"> <!-- 这个name没啥用 -->
		<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://127.0.0.1/testdb</property>
		<!-- url格式:mysql url+ 数据库名字-->
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
		<!-- 用户名及密码 -->
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<!-- 下面指的是相应类配置文件,需要把。改为/ -->
		<mapping resource="com/learn/po/Teacher.hbm.xml"/>
		<mapping resource="com/learn/po/Student.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

6\HibernateUtil.java

package com.ehr.dao;

import java.io.Serializable;

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class HibernateUtil {

	private static final SessionFactory sessionFactory;

	static {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static Serializable addObject(Object o) {
		// 获得session对象
		Serializable s = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();
		try {
			 s = session.save(o);// 把对象保存到db,并且返回新建列的主键值
			// 提交事务
			tx.commit();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			tx.rollback();
		} finally {
			session.close();
		}
		return s;
	}

    public static void main(String[] args) {
		Configuration cfg =new Configuration().configure();
		SchemaExport e = new SchemaExport(cfg);
		e.create(true, true);
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 05:41:30

SSH学习四 Hibernate多对一的关系 + 增删改查的相关文章

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

hibernate学习笔记之三(单条记录的增删改查)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) 保存用户 session.save(person); session.persist(person); 查询用户 load(Class theClass,Serializable id) get(Class theClass,Serializable id) 修改用户 session.update(person) session.merger(person); 保存或修改用户 session.sav

Hibernate之API初识及增删改查实现

声明:关于hibernate的学习.非常大一部分东西都是概念性的. 大家最好手里都有一份学习资料,在我的博文中.我不会把书本上的概念一类的东西搬过来.那没有不论什么意义.关于hibernate的学习,我主要是通过演示项目让大家加深一些概念的理解,同一时候,也是为了让大家深层次的理解hibernate.而不仅仅是单纯的停留在概念上,假设仅仅是单纯的理解一些概念性的东西.到最后你们肯定会一无所获.并且过段时间就会忘记.所以以后的hibernate的学习.希望大家多看下演示项目.下载下来部署上演示看看

1.hibernate七步走完成增删改查

一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操作(增删改查), 它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过javabean对象去操作数据库中数据. 4.hiberante概念 hibernate就是采用orm对象关系映射技术的持久化开发框架. 5.hibernate优缺点及使用场合 1.优点 hibernate很强大

hibernate基本配置与简单增删改查

ORM(Object Relation Mapping)是对象关系映射,是一个思想,它的作用是在关系数据库与对象之间做一个自动映射,将数据库中的表格映射到一个类,也就是持久化类,数据表中每行映射为对象,行中的各个字段映射为对象的属性,这样可以在开发中使用面向对象的思想来操作数据库. 其中hibernate是ORM思想实现的一个持久层框架. 其中有三个主要的内容:1.持久化类(*.java) 2.映射文件(*.hbm.xml) 3.配置文件(*.cfg.xml) 使用Hibernate框架搭建一个

Hibernate实现最基本的增删改查

Hibernate提供了丰富的API对数据库进行操作. 其中Session是对数据库进行操作一个非常重要的类,他提供了对数据库增删改查的基本操作. 下面看一些具体示例,实例中实现了对数据库增加,删除,更新,根据ID查询,查询全部,分页查询,以及模糊查询 package dao; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hiberna

SQL学习(二)SQL基础的增删改查

在测试时使用数据库时,用的比较多的就是增删改查SQL了. 一.增加(insert into ...values) 用于向表中插入新记录 1.不指定列(表示:依次插入所有列的值) insert into ticket values('2','测试') 2.指定列(表示:指定列插入数据) insert into ticket(name) values('测试') 二.删除(delete) 用于删除表中的行 1.删除所有行 delete from ticket 或:delete * from tick

spring学习(四)spring的jdbcTemplate(增删改查封装)

Spring的jdbcTemplate操作 1.Spring框架一站式框架 (1)针对javaee三层,每一层都有解决技术 (2)到dao 层,使用 jdbcTemplate 2.Spring对不同的持久化都进行了封装 (1)jdbcTemplate  对  jdbc 进行封装 3.jdbcTemplate 使用和 dbutils 使用很相似,都是对数据库进行 crud 操作 4.使用jdbcTemplate 实现增删改查操作 增加: 1.导入 jdbcTemplate 相关jar 包 一定要导

【知了堂学习笔记】mysql之数据库的增删改查

一.DDL 1.创建数据库 create database 数据库名 *数据库名不能中文, 不能数字正常英文 , 关键字会自动变大写 2.删除数据库 drop database 数据库名 3.使用数据库 use 数据库名 *如果有很多数据库,要具体使用时,可以手动选择,可以通过语法形式声明使用哪一个 二.操作表 1.创建表 create table 表名(列名1 列1的数据类型 列的约束 ,列名2 列2的数据类型 列的约束) eg:创建一张学生表 CREATE TABLE t_student(