今日公司项目开发需要整合hibernate,之前用的是mybatis,啥都别说,学呗,下边是我学习hibernate api后整理的代码,代码比较简单,有不足的地方请指正!这只是一个入门的例子。。。
项目目录:
所用的jar包(每个jar具体的作用这里就不列出来了,可以参http://nopainnogain.iteye.com/blog/761630):
具体的项目代码请查看附件,这里贴出测试代码,便于讨论问题,注:初学者,代码乱请见谅!
package com.hibernate.demo.test;
import org.hibernate.Session;
import java.util.List;
import java.util.Date;
import com.hibernate.demo.po.Event;
import com.hibernate.demo.util.HibernateUtil;
public class EventManager {
Session session = null;
public EventManager(){
session = HibernateUtil.getSessionFactory().getCurrentSession();
}
public void testInsert(EventManager mgr){
mgr.createAndStoreEvent("My Event", new Date());
}
@SuppressWarnings("rawtypes")
public void testList(EventManager mgr){
if(true){
List events = mgr.listEvents();
for (int i = 0; i < events.size(); i++) {
Event theEvent = (Event) events.get(i);
System.out.println("Event: " + theEvent.getTitle() +
" Time: " + theEvent.getDate());
}
}
}
/**
* ---测试load,观察返回的obj---
* 如果注释输出obj,则控制台没有输出sql语句(前提hibernate.cfg.xml设置show_sql=true),
* 原来,hibernate 使用延迟加载的策略,(默认hibernate.cfg.xml class节点的lazy属性为true),只要对应的对象没有
* 被使用,hibernate 瞒天过海告诉你我有这个对象(通过cglib,返回动态构建的一个代理类),其实并没有做任何事情,只有真正想获取对象 的时候,
* hibernate才开始做事(访问数据库)。好处:提高性能,只有真正用到的时候才访问数据库,减少内存消耗
*
* 如果hibernate 无法取到这个对象,报ObjectNotFoundEcception异常
*
* @author apprenctice
*/
public void testLoad(){
session.beginTransaction();
Object obj = session.load(Event.class,new Long(1));
System.out.println(obj);
// session.getTransaction().commit(); 此处注释掉,commit后自动关闭session
}
/**
* ---测试get,观察返回的obj---
* 如果你运行了这个程序,你会发现,用load输出的obj和get输出的公用同一块内存空间,what's wrong?
* 不是说get每次都会访问数据库吗?原来,我在load的时候,(hibernate缓存机制)session里已经有了obj这个对象
* 聪明的hibernate还会去数据库取吗?session帮了我们大忙,提高了性能。如果session中有,则直接返回这个对象(其实是个代理)
*
* 如果hibernate 无法取到这个对象,返回null
*
* @author apprenctice
*
*/
public void testGet(){
session.beginTransaction();
Object obj = session.get(Event.class, new Long(1));
System.out.println(obj);
session.getTransaction().commit();
}
public static void main(String[] args) {
EventManager mgr = new EventManager();
// mgr.testInsert(mgr); //将event保存入数据库,此处需注释hibernate.cfg.xml中的 hbm2ddl.auto
//否则,每次显示关闭sessionfactory时都会还原数据库
// mgr.testList(mgr); //列出所有events
mgr.testLoad(); //测试load
mgr.testGet(); //测试get
HibernateUtil.getSessionFactory().close();
}
private void createAndStoreEvent(String title, Date theDate) {
session.beginTransaction();
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
session.save(theEvent);
session.getTransaction().commit();
}
@SuppressWarnings("rawtypes")
private List listEvents() {
session.beginTransaction();
List result = session.createQuery("from Event").list();
session.getTransaction().commit();
return result;
}
}
测试结果:
Hibernate: select event0_.EVENT_ID as EVENT1_0_0_, event0_.EVENT_DATE as EVENT2_0_0_, event0_.EVENT_TITLE as EVENT3_0_0_ from EVENTS event0_ where event0_.EVENT_ID=?
com.hibernate.demo.po.Event@1b33a0e
com.hibernate.demo.po.Event@1b33a0e
代码见附件hibernate3,欢迎初学者与我交流,一同进步!!!同时也欢迎专家多多指教!!!