实例学习Hibernate
学习方式,采用做一个小型的留言本,因为要很好的使用Hibernate,在做系统之前,就必须把整个系统要做什么、要做些什么内容、怎么做等处理好,这样才能够在使用的过程中,较少的回去更改配置文件和程序。
1、整个系统要做什么?
做一个系统留言系统,方便用户留言
2、要做些什么内容?
1)、实现简单的留言功能
2)、可以查看留言
3)、可以删除留言
4)、可以更改留言
5)、可以回复留言
3、怎么做?
语言是JSP+Hibernate
4、数据表设计
1)数据库选择:MySQL5.X
2)数据表设计:
LeaveMSG(留言表)
|
字段名
|
类型
|
说明
|
Id
|
自增型
|
ID主键
|
author
|
Text(50)
|
留言者
|
ldate
|
Text(50)
|
留言日期
|
msg
|
memo
|
留言内容
|
ReplyMSG(留言回复表)
|
字段名
|
类型
|
说明
|
Id
|
自增型
|
ID主键
|
lid
|
LeaveMSG ID
|
留言表的ID
|
rauthor
|
Text(50)
|
回复人
|
rdate
|
Text(50)
|
回复日期
|
rmsg
|
memo
|
回复内容
|
3)建表SQL语句:
a.建立数据库:Create database msg;
b.更改数据库:Use msg;
c.建立表LeaveMSG:Create table LeaveMSG(id int AUTO_INCREMENT primary key not null,author varchar(50),ldate varchar(20),msg text);
d.建立表ReplyMSG:Create table ReplyMSG(id int AUTO_INCREMENT primary key not null,lid int not null,rauthor varchar(50),rdate varchar(20),rmsg text);
e.建立外键关系:alter table replymsg add foreign key (lid) references leavemsg(id)
5、生成“.hbm.xml”配置文件:
使用Hiddlegen-Hibernate-r5生成配置文件,详细步骤可以参看文章:
(注:最好是用middlegen2.1,我现在用的是这个,功能更强大,可以生成好多种的配置文件)
成功配置运行好,会出现如下界面:
这时可以到build\gen-src看刚刚生成的Leavemsg.hbm.xml和Replymsg.hbm.xml了。
6、启动JDeveloper,并建立工程,将Hibernate的包导入到类路径、并MYSQL的JDBC驱动程序导入类路径。(操作实例的时候出问题了)
注:因为做双表关联的映射出错,但是如果只做单表,不做双表关联,就不会出错,这里我还是把只做一个表操作的详细写下来,也算是宽慰宽慰自己吧:
1)、工程文件图如下:
文件结构图如下:
2)我这里用的是Mysql数据库,需要用的文件内容如下:
hibernate.cfg.xml的内容如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost/msg</property>
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<!--thread is the short name for
org.hibernate.context.ThreadLocalSessionContext
and let Hibernate bind the session automatically to the thread
-->
<property name="current_session_context_class">thread</property>
<mapping resource="msg/hibernate/Leavemsg.hbm.xml" />
</session-factory>
</hibernate-configuration>
Leavemsg.java的内容如下:
package msg.hibernate;
import java.io.Serializable;
public class Leavemsg implements Serializable {
public Leavemsg() {
}
int id;
String author;
String ldate;
String msg;
…//下面都是一些get及set方法,用Eclipse和Jdeveloper都可以自动生成
}
这个很简单,就是一个实实在在的POJO JAVA BEAN,这个只要你定义了变量名,Eclipse和JDeveloper都可以自动为你生成get及set 方法。
Leavemsg.hbm.xml的内容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.1
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="msg.hibernate.Leavemsg"
table="leavemsg"
>
<meta attribute="class-description" inherit="false">
@hibernate.class
table="leavemsg"
</meta>
<id
name="id"
type="java.lang.Integer"
column="id"
>
<meta attribute="field-description">
@hibernate.id
generator-class="assigned"
type="java.lang.Integer"
column="id"
</meta>
<generator class="assigned" />
</id>
<property
name="author"
type="java.lang.String"
column="author"
length="50"
>
<meta attribute="field-description">
@hibernate.property
column="author"
length="50"
</meta>
</property>
<property
name="ldate"
type="java.lang.String"
column="ldate"
length="20"
>
<meta attribute="field-description">
@hibernate.property
column="ldate"
length="20"
</meta>
</property>
<property
name="msg"
type="java.lang.String"
column="msg"
length="65535"
>
<meta attribute="field-description">
@hibernate.property
column="msg"
length="65535"
</meta>
</property>
<!-- Associations -->
<!-- bi-directional one-to-many association to Replymsg -->
<set
name="replymsgs"
lazy="true"
inverse="true"
cascade="none"
>
<meta attribute="field-description">
@hibernate.set
lazy="true"
inverse="true"
cascade="none"
@hibernate.collection-key
column="lid"
@hibernate.collection-one-to-many
class="msg.hibernate.Replymsg"
</meta>
<key>
<column name="lid" />
</key>
<one-to-many
class="msg.hibernate.Replymsg"
/>
</set>
</class>
</hibernate-mapping>
因为做这里只做单表测试,所以,我把绿色部分去掉了,即去掉和replymsg之间的映射,因为现在做映射还会出错。
显然, 为了能对实体对象进行ORM, 我们需要的到一个Session 对象, Session 从哪里
来呢? 由SessionFactory 创建, SessionFactory 呢? 除了直接使用Hibernate 自带的之外,
MyEclipse 可以生成如下的包装代码:
HSFactory.java:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HSFactory {
static ThreadLocal threadLocal = new ThreadLocal();
static Configuration configuration = new Configuration();
static SessionFactory sessionFactory;
static String configFile = "/hibernate.cfg.xml";
//返回本地线程的Session实例。对SessionFactory采用lazy初始化
public static Session getCurrentSession() {
Session session = (Session)threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null)
rebuildSessionFactory();
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
//关闭本地线程的Session实例
public static void closeCurrentSession() {
Session session = (Session)threadLocal.get();
session.close();
}
//重新构建SessionFactory对象
public static void rebuildSessionFactory() {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
}
}
下面这段代码一并演示了单表的CRUD, 包括全查和全删:
MsgDAO.java:
import java.util.List;
import msg.hibernate.Leavemsg;
import org.hibernate.*;
public class MsgDAO {
private Session session;
public Session getSession() {
return HSFactory.getCurrentSession();
}
public void setSession(Session session) {
this.session = session;
}
public void save(Leavemsg obj) {
getSession().save(obj);
}
public void delete(Leavemsg obj) {
getSession().delete(obj);
}
public void update(Leavemsg obj) {
getSession().update(obj);
}
public Leavemsg findByPK(Integer id) {
return (Leavemsg)getSession().get(Leavemsg.class, id);
}
public List findAll() {
Query query = getSession().createQuery("from Leavemsg");
return query.list();
}
public int deleteAll() {
Query query = getSession().createQuery("delete from Leavemsg");
return query.executeUpdate();
}
}
测试类,直接运行该类就可以:
Test.java:
import msg.hibernate.Leavemsg;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Test {
public static void main(String[] args) {
Session session = HSFactory.getCurrentSession();
Leavemsg msg = new Leavemsg();
msg.setAuthor("FLB");
msg.setLdate("2007-09-12");
msg.setMsg("A first hibernate!");
MsgDAO dao = new MsgDAO();
dao.setSession(session);
Transaction tx = null;
try {
//开始事务
tx = session.beginTransaction();
dao.save(msg);
//提交事务
tx.commit();
} catch (Exception e) {
//回滚事务
if (tx != null)
tx.rollback();
} finally {
HSFactory.closeCurrentSession();
}
}
}
分享到:
相关推荐
- 数据库设计与表创建是学习Hibernate与Struts实例的基础,需要掌握SQL语言和数据库基本操作。 - 在Java Web工程中配置数据源,了解不同数据库的配置方法和差异。 - Hibernate配置文件的编写,包括SessionFactory的...
《Hibernate5实例程序》是一份专为学习Hibernate5框架所编写的代码实例集。Hibernate作为Java领域中的一款主流对象关系映射(ORM)工具,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑,而非底层的SQL...
这个实例包可能是为了帮助开发者理解和学习如何在实际项目中使用Hibernate 4.0.0版本。通过分析示例代码,可以了解如何配置Hibernate,创建实体类,定义关联,编写HQL或Criteria查询,以及如何处理事务和缓存。同时...
【描述】"本项目在eclipse下开发,使用java Hibernate模型编程,是很好的学习资料"表明这个项目是基于Eclipse IDE创建的,适合初学者或进阶者学习Hibernate框架。通过这个项目,你可以了解如何在Eclipse中配置...
描述中提到"这是一个Hibernate实例,使用oracel数据库,并用junit和自定义类分别进行了测试",这暗示我们将深入学习如何配置Hibernate以连接Oracle数据库,以及如何利用JUnit进行单元测试和自定义测试类以确保代码的...
总结来说,"一个Hibernate的简单实例"是Java开发者学习Hibernate框架的起点,它涵盖了从配置文件设置到实体类设计,再到数据库操作的基本步骤。通过这个实例,你可以深入理解Hibernate如何将Java对象和数据库表进行...
开发者可以通过这个实例学习如何配置SpringMVC和Hibernate,理解它们之间的协作方式,以及如何编写实际的业务代码。 在这个实例中,你可以学习到以下知识点: 1. SpringMVC的配置,包括DispatcherServlet配置、视图...
标题“hibernate实例连oracle”表明我们正在讨论如何使用Hibernate框架来连接并操作Oracle数据库。...通过这个实例,开发者可以学习到如何将Java Web应用与企业级数据库无缝对接,以及如何优化数据访问性能。
总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...
注:为节省空间,程序中需要的jar包,均在HibernateManytoManyMapCascadingSave.zip\HibernateManytoManyMapCascadingSave\lib\ <br>Hibernate 多对多实体映射实例 <br>学习Hibernate 实体映射的映射的好帮手...
【购物车实例(Struts+Hibernate)】是一个典型的Web应用开发案例,主要针对那些刚开始学习Struts和Hibernate框架的开发者。这个实例通过实现一个在线购物车的功能,帮助开发者理解这两个框架如何协同工作来构建实际...
本实例代码旨在为初学者提供一个基础的Hibernate使用教程,帮助理解其基本概念和操作流程。 ### Hibernate概述 Hibernate 是一个开源的ORM框架,它将Java类与数据库表关联,通过对象的方式来处理数据库的CRUD(创建...
在IT领域的数据库设计与对象关系映射(ORM)框架中,Hibernate作为一个强大的工具,被广泛应用...对于那些希望在Java应用程序中高效管理复杂数据关系的开发者而言,Hibernate无疑是一个值得深入学习和掌握的强大工具。
**hibernate框架学习实例** Hibernate 是一个强大的Java持久化框架,它简化了数据库与对象之间的交互,使得开发者可以更加专注于业务逻辑而不必过多地处理SQL语句。...祝你在学习Hibernate的过程中取得进步!
Struts、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同...通过这个"Struts+Hibernate+Spring学习实例",开发者可以深入理解这三个框架如何共同构建一个完整的Web应用,提升在实际项目中的应用能力。
通过这个实例,新手可以快速地熟悉Hibernate的基本使用,并为进一步深入学习Hibernate打下良好的基础。 在Hibernate的使用中,理解其配置文件和映射机制是关键。同时,对于初学者而言,掌握Session和Transaction的...
描述中的"hibernate开发实例源码"进一步强调了这份资料以代码实践为主,帮助读者通过实际操作来学习和理解Hibernate。"其中有初学者使用的具体实例,也有进阶程序员常用的一些hibernate实例"说明了内容的全面性,...
**hibernate框架实例** Hibernate 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务,而无需关注底层的SQL语句。本实例旨在帮助初学者更好...
Hibernate三态及简单实例,主要简单的使用Hibernate的CRUD,这是我学习Hibernate写的。跟大家分享下。