现在的位置: 首页 > 综合 > 正文

Hibernate构建一个CURD的程序

2013年04月08日 ⁄ 综合 ⁄ 共 2827字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.