完成功能:对实体Event进行CURD操作
1、项目结构
2、配置hibernate.xml和log4j的控制台输出描述文件log4j.properties
3、编写一个HibernateUtil工具类
package com.akwolf.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory SESSION_FACTORY = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { return new Configuration().configure("hibernate.xml") .buildSessionFactory(); } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } public static SessionFactory getSessionFactory() { return SESSION_FACTORY; } }
4、完成Event实体
package com.akwolf.bean; import java.util.Date; public class Event { private long id; private String title; private Date date; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Override public String toString() { return "Event [date=" + date + ", id=" + id + ", title=" + title + "]"; } }
5、设置Event实体的映射文件
<?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 package="com.akwolf.bean"> <class name="Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="native" /> </id> <property name="date" column="EVENT_DATE" type="timestamp"></property> <property name="title" column="EVENT_TITLE" type="java.lang.String" /> </class> </hibernate-mapping>
6、编辑一个测试类:
package com.akwolf.test; import java.util.Date; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.akwolf.bean.Event; import com.akwolf.util.HibernateUtil; public class EventManager { public static void main(String[] args) { EventManager mgr = new EventManager() ; //createAndStoreEvent(); mgr.listEvent() ; } public static void createAndStoreEvent() { Event event = new Event(); event.setDate(new Date()); event.setTitle("ok张"); // 取得会话工厂 SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 取得一个会话 Session session = sessionFactory.getCurrentSession(); // 开始事物 session.beginTransaction(); session.save(event); // System.out.println(event); // 提交事物 session.getTransaction().commit(); sessionFactory.close(); } public void listEvent() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Event> list = session.createQuery("from Event").list(); session.getTransaction().commit(); HibernateUtil.getSessionFactory().close(); for (Event event : list) { System.out.println(event); } } }
7、注意问题:
(1)当事物结束的时候,不管是提交还是回滚,Hibernate会自动把Session从当前线程剥离,并且关闭它。若再次调用getCurrrentSession(),会得到一个新的Session,并开始一个新的工作单元。
(2)绝不要把程序设计成每次操作数据库都取得一个新的Session。
(3)连接池使用c3p0,在网上看了一篇文章说dbcp的bug很多,以至于Hibernate的作者比较恼火,官方支持的c3p0。
8、遇到问题:
在做插入操作是出现乱码,检查了一下原因是在刚开始安装mysql时,配置选择的是默认配置,而漠视的是Latin-1,是不支持中文,于是重装mysql调整编码,但插入时报错了,郁闷了一下,,想了一下,数据库hibernate是以上一个lation-1的编码创建的,于是删掉重建,问题解决。