完成功能:对实体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的编码创建的,于是删掉重建,问题解决。