Hibernate构建一个CURD的程序


完成功能:对实体Event进行CURD操作

1、项目结构

2、配置hibernate.xml和log4j的控制台输出描述文件log4j.properties

3、编写一个HibernateUtil工具类

[java]
  1. package com.akwolf.util;  
  2.   
  3. import org.hibernate.SessionFactory;  
  4. import org.hibernate.cfg.Configuration;  
  5.   
  6. public class HibernateUtil {  
  7.     private static final SessionFactory SESSION_FACTORY = buildSessionFactory();  
  8.   
  9.     private static SessionFactory buildSessionFactory() {  
  10.         try {  
  11.             return new Configuration().configure("hibernate.xml")  
  12.                     .buildSessionFactory();  
  13.         } catch (Throwable e) {  
  14.             throw new ExceptionInInitializerError(e);  
  15.         }  
  16.     }  
  17.   
  18.     public static SessionFactory getSessionFactory() {  
  19.         return SESSION_FACTORY;  
  20.     }  
  21. }  

4、完成Event实体

[java]
  1. package com.akwolf.bean;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Event {  
  6.     private long id;  
  7.     private String title;  
  8.     private Date date;  
  9.   
  10.     public long getId() {  
  11.         return id;  
  12.     }  
  13.   
  14.     public void setId(long id) {  
  15.         this.id = id;  
  16.     }  
  17.   
  18.     public String getTitle() {  
  19.         return title;  
  20.     }  
  21.   
  22.     public void setTitle(String title) {  
  23.         this.title = title;  
  24.     }  
  25.   
  26.     public Date getDate() {  
  27.         return date;  
  28.     }  
  29.   
  30.     public void setDate(Date date) {  
  31.         this.date = date;  
  32.     }  
  33.   
  34.     @Override  
  35.     public String toString() {  
  36.         return "Event [date=" + date + ", id=" + id + ", title=" + title + "]";  
  37.     }  
  38.       
  39.       
  40. }  
5、设置Event实体的映射文件

[html]
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping package="com.akwolf.bean">  
  7.     <class name="Event" table="EVENTS">  
  8.         <id name="id" column="EVENT_ID">  
  9.             <generator class="native" />  
  10.         </id>  
  11.         <property name="date" column="EVENT_DATE" type="timestamp"></property>  
  12.         <property name="title" column="EVENT_TITLE" type="java.lang.String" />  
  13.     </class>  
  14. </hibernate-mapping>  

6、编辑一个测试类:

[java]
  1. package com.akwolf.test;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5.   
  6. import org.hibernate.Session;  
  7. import org.hibernate.SessionFactory;  
  8.   
  9. import com.akwolf.bean.Event;  
  10. import com.akwolf.util.HibernateUtil;  
  11.   
  12. public class EventManager {  
  13.     public static void main(String[] args) {  
  14.         EventManager mgr = new EventManager() ;  
  15.         //createAndStoreEvent();   
  16.         mgr.listEvent() ;  
  17.     }  
  18.   
  19.     public static void createAndStoreEvent() {  
  20.         Event event = new Event();  
  21.         event.setDate(new Date());  
  22.         event.setTitle("ok张");  
  23.         // 取得会话工厂   
  24.         SessionFactory sessionFactory = HibernateUtil.getSessionFactory();  
  25.         // 取得一个会话   
  26.         Session session = sessionFactory.getCurrentSession();  
  27.         // 开始事物   
  28.         session.beginTransaction();  
  29.         session.save(event);  
  30.   
  31.         // System.out.println(event);   
  32.   
  33.         // 提交事物   
  34.         session.getTransaction().commit();  
  35.         sessionFactory.close();  
  36.     }  
  37.   
  38.     public void listEvent() {  
  39.         Session session = HibernateUtil.getSessionFactory().getCurrentSession();  
  40.         session.beginTransaction();  
  41.         List<Event> list = session.createQuery("from Event").list();  
  42.         session.getTransaction().commit();  
  43.         HibernateUtil.getSessionFactory().close();  
  44.         for (Event event : list) {  
  45.             System.out.println(event);  
  46.         }  
  47.   
  48.     }  
  49.   
  50. }  
7、注意问题:

(1)当事物结束的时候,不管是提交还是回滚,Hibernate会自动把Session从当前线程剥离,并且关闭它。若再次调用getCurrrentSession(),会得到一个新的Session,并开始一个新的工作单元。

(2)绝不要把程序设计成每次操作数据库都取得一个新的Session。

(3)连接池使用c3p0,在网上看了一篇文章说dbcp的bug很多,以至于Hibernate的作者比较恼火,官方支持的c3p0。


8、遇到问题:

在做插入操作是出现乱码,检查了一下原因是在刚开始安装mysql时,配置选择的是默认配置,而漠视的是Latin-1,是不支持中文,于是重装mysql调整编码,但插入时报错了,郁闷了一下,,想了一下,数据库hibernate是以上一个lation-1的编码创建的,于是删掉重建,问题解决。

相关内容