学习hibernate笔记

以前学习java的时候,一开始就学习了hibernate,那时候总觉得ssh非常高大上,所以就急忙看了下相关视频。不过因为实际需要不高,所以后来一直没有使用上hibernate组件。现在一年过去了,也疯狂学习了java一段时间了,做过几个不大的项目,但是总算对java有些了解。现在参加了工作,公司使用的就是ssh,所以这两天又重新开始捣鼓hibernate。这次学习直接使用editplus,直接开发。看了官网的demo,发现英语也没有想象中那么困难。哈哈,把自己的学习记录下来吧。这里主要记录三个方面:

1.如何搭建hibernate

2.几种常用映射关系(one - to -one,one - to - many, many - to - one, many - to - many)

搭建hibernate(直接使用文本编辑器)

第一步:这个过程也不复杂,主要是下载到hibernate相关jar包,然后将必要的jar引入到classpath中,具体什么是classpath,大家可以百度下。如果不导入到classpath中,会出现不能找到类的异常。为什么会出现这种情况呢?大家可以百度下,java 的类加载过程。

第二步:编写hibernate.cfg.xml文件。这个大家不用手写,直接去hibernate文章中copy一个即可。下面给出我的代码

<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE hibernate-configuration PUBLIC
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

	 <session-factory>
           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_demo</property>
           <property name="hibernate.connection.username">root</property>
           <property name="hibernate.connection.password">root</property>
           <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
           <property name="hibernate.show_sql">true</property>
		   <!--if the value='create, means create table, every time open hibernate, if will drop the old scheme'-->
		   <property name="hbm2ddl.auto">update</property>
		   <mapping resource="User.xml"/>
		   <mapping resource="Address.xml"/>
      </session-factory>

</hibernate-configuration>

第三步:开始制作一个工具类,用来初始化hibernate组件。由于难度不高,直接给出代码,这些在文章中都已经有了,大家可以自己下载document看看。下面是代码:

import java.io.*;
import org.hibernate.*;
import org.hibernate.cfg.*;

/**
 * that is a hibernate config util
 * */
public class HibernateConfigurationUtil{

	private static HibernateConfigurationUtil singleton = new HibernateConfigurationUtil("hibernate.cfg.xml");
    private static SessionFactory factory;

	/**
	 * singleton pattern
	 * */
	private HibernateConfigurationUtil(String configXml){
	    init(configXml);
	}

	public void init(String configXml){
	     Configuration cfg = new Configuration().configure(new File("hibernate.cfg.xml"));
		 factory = cfg.buildSessionFactory();   // build the session factory
	}

	public static SessionFactory getSessionFactory(){
	    if(factory == null) return null;
		return factory;
	}

    /**
	 * open a new Session
	 *
	 * */
	public static Session openSession(){
	    Session session = factory.openSession();
		return session;
	}

}

注意下,这个类使用单例设计模式,因为hibernate组建在启动Configuration时,是非常耗时的,而且这个对象在启动之后不能改变,所以每个工程中,启动一次即可。

第三步:编写BaseHibernateDao,这个类注意是封装了save, delete, update, load这四个方法。

import java.io.*;
import org.hibernate.*;
import org.hibernate.cfg.*;

/**
 * that is the base hibernate dao,
 * it define a series of method to access database
 * if you want to 'delete, update a object, the object must exists in hibernate memery'
 *
 * @author luohong
 * @date 2014-08-07
 * */
public class BaseHibernateDao{
	public BaseHibernateDao(){
	}

    /**
	 * try to save a object
	 * */
	public void save(Object object){
	    Session session = HibernateConfigurationUtil.openSession();
		// open transaction
		Transaction transaction = session.beginTransaction();
		session.save(object);
		// commint transaction
		transaction.commit();

	}

	/**
	 * try to update a object
	 * */
	public void update(Object object){
	    Session session = HibernateConfigurationUtil.openSession();
		// open transaction
		Transaction transaction = session.beginTransaction();
		session.update(object);
		// commint transaction
		transaction.commit();
	}

    /**
	 * try to delete a object
	 * */
	public void delete(Object object){
	    Session session = HibernateConfigurationUtil.openSession();
		// open transaction
		Transaction transaction = session.beginTransaction();
		session.delete(object);
		// commint transaction
		transaction.commit();
	}

	/**
	 * try to load a object from database by className and id
	 * */
	public Object load(Class<?> className, Serializable id){
		Session session = HibernateConfigurationUtil.openSession();
        // there is no need for transaction
		return session.load(className, id);
	}

}

注意:在save, update, delete方法中,只用了Transaction,要开启事务,否则数据库找不到相关记录。

第四步:到了这里之后,就非常简单了,只需要针对具体的类,扩展BaseHibernateDao即可。下面给出一个一对多的例子。模拟情景:用户(User)拥有多个住址(Address)首先给出两个类:

import java.util.*;

public class User{
	private int id;
	private String password;
	private String name;
    private Set<Address> addressSet;

	public void setAddressSet(Set<Address> addressSet){
	    this.addressSet = addressSet;
	}

	public Set<Address> getAddressSet(){
	    return addressSet;
	}

	public void setName(String name){
	    this.name = name;
	}

	public String getName(){
	    return name;
	}

	public void setId(int id){
	    this.id = id;
	}

	public int getId(){
	    return id;
	}

	public void setPassword(String password){
	    this.password = password;
	}

	public String getPassword(){
	    return password;
	}

	public String toString(){
	    return "id = " + id + ", name = " + name + ", password = "
			+ password + ", addressSet = " + addressSet;
	}
}
/**
 * that is the user address
 * a user have many address, but a adress belong to a user
 * It is the classical 1 * n relationship
 * @author luohong
 * @date 2014-08-07
 * */
 public class Address {

//=====================properties=============================
	 private int id;
	 //private User belongTo;
	 private String code;
	 private String city;
	 private String street;
	 private String homeNumber;

//===================setter and getter========================
	 public void setId(int id){
	     this.id = id;
	 }

	 public int getId(){
	     return id;
	 }
/*
	 public void setBelongTo(User user){
	     this.belongTo = belongTo;
	 }

	 public User getBelongTo(){
	     return belongTo;
	 }
*/

	 public void setCode(String code){
	     this.code = code;
	 }

	 public String getCode(){
	     return code;
	 }

	 public void setCity(String city){
	     this.city = city;
	 }

	 public String getCity(){
	     return city;
	 }

	 public void setHomeNumber(String homeNumber){
	     this.homeNumber = homeNumber;
	 }

	 public String getHomeNumber(){
		 return homeNumber;
	 }

	 public String getStreet(){
	     return street;
	 }

	 public void setStreet(String street){
         this.street = street;
	 }

//========================toString================================
	 public String toString(){
	     return "id = " + id + ", city = " + city + ", street = " + street + ", homeNumber = " + homeNumber
			 + ", code = " + code;// + ", belongTo = " + belongTo;
	 } 

 }

给出相关的User.xml, Address.xml;这个例子使用的是单向一对多。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  

<hibernate-mapping>

	<class name="User" table="user">
		<id name="id">
			<generator class="increment"/>
		</id>

		<property name="password"/>

		<property name="name"/>

		<!--one to many-->
		<set name="addressSet" cascade="all">
		    <!--define the foreight column name-->
		    <key column="user_id"/>
			<!--define the foreight table name-->
			<one-to-many class="Address"/>
		</set>
	</class>

</hibernate-mapping>  
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  

<hibernate-mapping>

	<class name="Address" table="address">
		<id name="id">
			<generator class="increment"/>
		</id>
		<property name="code"/>

		<property name="city"/>

		<property name="street"/>
		<property name="homeNumber"/>

	</class>

</hibernate-mapping>  

然后编写一个UserDao,继承BaseHibernateDao,也很简单,哈哈,一看就懂,这就是hibernate的厉害之处。

import java.util.*;
import org.hibernate.*;
/**
 * user dao extends BaseHibernateDao
 * you can add new functions to the custom dao
 *
 *
 * @author luohong
 * @date 2014-08-07
 * */
public class UserDao extends BaseHibernateDao{
    /**
	 * delete a user by userId
	 *
	 * */
	public void deleteById(String id){
		if (id == null) return;  // do nothing

		String hql = "delete User where id=?";
		// 1 open session
	    Session session = HibernateConfigurationUtil.openSession();
		// 2 create a query
		Query query = session.createQuery(hql);
		// 3 set the parameter to query
		query.setString(1, id);
		// 4 execute query
		query.executeUpdate();
	}

	/**
	 * find all user from database
	 * */
	public List<User> findAllUsers(){
	    String hql = "from User";
		Session session = HibernateConfigurationUtil.openSession();
		Query query = session.createQuery(hql);
		List userList = query.list();
		return (List<User>)userList;
	}
}

剩下的就是测试啦,come on...

import java.io.*;
import java.util.*;

/**
 * hibernate orm 框架demo
 * @author luohong
 * @date 2014-08-06
 *
 * */
public class HibernateDemo{
	public static void main(String[] args) throws Exception{

		UserDao userDao = new UserDao();

		User user = new User();
		user.setName("luohong");
		user.setPassword("luohong");

		Set<Address> addressSet = new HashSet<Address>();
		for(int i=0; i<3; i++){
			Address address = new Address();
			address.setCode("111");
			address.setCity("hongkang");
			address.setStreet("universal street");
			address.setHomeNumber("a-2846");
			//address.setBelongTo(user);

			addressSet.add(address);
		}

		user.setAddressSet(addressSet);

		userDao.save(user);
	}
}

学习hibernate笔记,布布扣,bubuko.com

时间: 2024-10-25 11:44:54

学习hibernate笔记的相关文章

[SQLServer]学习总结笔记(基本涵盖Sql的所有操作)

--################################################################################### /* 缩写: DDL(Database Definition Language): 数据库定义语言 DML(Database Manipulation Language): 数据库操作语言 DCL(Database Control Language): 数据库控制语言 DTM(Database Trasaction Manag

学习hibernate出现错误--之二(方言)

最近在学习hibernate,其中关于错误的问题真是一头大,各种各样的奇葩错误层出不穷,简直是受不了了. 用hibernate操作数据库,在使用hibernate进行把持久化类自动生成相关数据库表的时候,出现了一些问题. 其中有上篇错误<hibernate学习错误--之一>,在上篇错误解决完成后,进行测试时通过了,没有报错,但是却没有生成表,控制台窗口显示一些找不到相关table的警告,找了半天也不知道错误出现再哪儿,查看配置文件感觉也没问题,配置文件上的一些基本信息,有些是原封不动的从以前一

Hibernate笔记①--myeclipse制动配置hibernate

Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命 意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任. Hibernate笔记①--myeclipse制动配置hibernate

Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test    public void  test1()    {        Session session = null;         try {             session = Hiber

Rhythmk 学习 Hibernate 02 - Hibernate 之 瞬时状态 离线状态 持久化状态 三状态

by:rhythmk.cnblogs.com 1.Hibernate 三种状态: 1.1.三种定义(个人理解,不一定准确):  瞬时状态(transient):    不被session接管,且不存在数据库中的对象的状态,类似于新New一个对象  离线状态 (detached):    数据库中存在而不被session接管  持久化状态(persistent): 对象被session管理且数据库中存在此对象 1.2. 状态之间转换关系图 2 .状态转换以及Hibernate数据库执行过程详解:

菜鸟学习Hibernate——一对多关系映射

Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创建实体类Classes和实体类Student Classes.java package com.bjpowernode.hibernate; import java.util.Set; public class Classes { private int id; private String nam

Rhythmk 学习 Hibernate 04 - Hibernate 辅助工具 之 JBoos Tool

1.安装JBoos Tool Help -> Install new Software 然后添加: http://download.jboss.org/jbosstools/updates/development http://download.jboss.org/jbosstools/updates/stable/ 稍等一刻,选择 Hibernate tool 下一步 ,完成后重启Eclipse即可. 2.项目配置文件生成: 2.1 新建一项目,项目右键生成相关配置 然后如图: 2.2 此处需

Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package com.rhythmk.model; import java.util.Date; public

Rhythmk 学习 Hibernate 01 - maven 创建Hibernate 项目之 增删改查入门

1.环境: Maven :3.1.1 开发工具:Spring Tool Suite 数据库 : Mysql  5.6 2.项目文件结构 文件代码: 2.1 .pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap