Hibernate入门之自己写的小例子的总结 zz

转载 2004年08月21日 18:45:00
俺是新学Hibernate的,望大家不要见笑。 

本机环境介绍: 
JB7.0 
hibernate-2.0.3 
Oracle8.1客户端 

数据库: 
局域网内的服务器上的Oracle8.1 
服务器IP地址:x.x.x.x 
端口:1521 
数据库名:OraHib 
(请保证以上数据库信息已建好,并获得操作数据库的登录名和密码) 

开始编程: 
(1)用JB新建一个工程,如hiberante_demo2, 


(2)为你的工程添加Required Libraries(Project->Project Properties->Paths->Required Libraries):添加hibernate-2.0.3目录中lib目录下的所有jar,添加hibernate-2.0.3根目录下hibernate2.jar,添加本地Oracle8.1目录中jdbc目录下的lib子目录中的classes12.zip(这里有连接数据库时需要的驱动oracle.jdbc.driver.OracleDriver)。 

------------------------ 
2004.3.11 15:23 补充: 
运行此程序时,有不少朋友碰到log4j报错的问题,建议大家留心classpath中是否有log4j的包, 
如果有这个包 
#可以在classpath中把它删除 
#也可以本例子第四步做完后复制log4j的prop文件(路径是:hibernate目录/src/log4j.properties)到工程的classes子目录下。 

感谢maxpain,zxyfd2000提出这个问题。 
------------------------ 

(3)新建一个Class,包是person,类名是PersonModel,它有三个成员变量分别是id,name,address(对应于数据库表中的三个字段。咦,表还没有阿!没关系,后边的程序会利用hibernate自动生成表,不需要自己再去操作数据库建表,真是太省事了,  ),类中还需要三个成员变量的get,set方法,代码结果如下: 

代码: 

package person; 

import java.io.Serializable; 

public class PersonModel implements Serializable { 
  private Long id; 
  private String name; 
  private String address; 
  public Long getId() { 
    return id; 
  } 
  public void setId(Long id) { 
    this.id = id; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setAddress(String address) { 
    this.address = address; 
  } 
  public String getAddress() { 
    return address; 
  } 


 


这样person.PersonModel这个类的工作就完了,我也休息一下。
_________________
侠客行

上一次由vatful于2004-3-11 周四, 下午3:24修改,总共修改了3次 
 
返回顶端       
 
 
vatful
JBoss







 时间: 2004-3-03 周三, 下午3:40    标题: Hibernate入门之自己写的小例子的总结(2)   

--------------------------------------------------------------------------------
 
上边做好了person.PersonModel类,我请各位看官注意一点,不是说可以自动生成表吗?是啊!那岂不是表中字段想怎么定义就怎么定义了啊?Yeah,完全正确。是不是觉得很自由啊! 

俺这个测试,主要是想对表进行插入和查询操作,并且这个表只有一个主键(这里就是id)!还有,后边还要写配置文件 PersonModel.hbm.xml (名称格式就是类名.hbm.xml,和类中内容完全对应,设置与数据库表之间的联系),因为这个测试中写的PersonModel.hbm.xml 非常简单,主键是用oracle数据库自动生成的,是整型的数据,写类时这个id我定义为long型了。你如果想用其他类型的主键,看看其他的文章吧。 

(4)编译person.PersonModel类,然后把hibernate-2.0.3目录中src子目录下的hibernate.properties文件拷贝到hiberante_demo2这个工程目录中的classes子目录下。 

(5)修改hibernate.properties中的数据源连接,在文件中找到如下所示的HypersonicSQL数据源连接的位置,这是默认的数据源连接。 
代码: 

## HypersonicSQL 

hibernate.dialect net.sf.hibernate.dialect.HSQLDialect 
hibernate.connection.driver_class org.hsqldb.jdbcDriver 
hibernate.connection.username sa 
hibernate.connection.password 
#hibernate.connection.url jdbc:hsqldb:hsql://localhost 
hibernate.connection.url jdbc:hsqldb:test 
 


六行中第五行已经注释掉了,现在把其他五行也注释掉。 
结果如下 
代码: 

## HypersonicSQL 

#hibernate.dialect net.sf.hibernate.dialect.HSQLDialect 
#hibernate.connection.driver_class org.hsqldb.jdbcDriver 
#hibernate.connection.username sa 
#hibernate.connection.password 
#hibernate.connection.url jdbc:hsqldb:hsql://localhost 
#hibernate.connection.url jdbc:hsqldb:test 
 


再找到 
代码: 

## Oracle 

#hibernate.dialect net.sf.hibernate.dialect.OracleDialect 
#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver 
#hibernate.connection.username ora 
#hibernate.connection.password ora 
#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test 
 

这是Oracle数据源连接 

去掉注释,修改为 
代码: 

## Oracle 

hibernate.dialect net.sf.hibernate.dialect.OracleDialect 
hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver 
hibernate.connection.username your_database_username 
hibernate.connection.password your_database_password 
hibernate.connection.url jdbc:oracle:thin:@x.x.x.x:1521:OraHib 
 

oracle.jdbc.driver.OracleDriver,因为这个类,所以开始要把class12.zip加进来。下边很好懂,数据库的登录名,密码,x.x.x.x 为数据库所在服务器的ip地址,1521是端口,OraHib是数据库名。 

(6)在PersonModel.class所在的目录中新建PersonModel.hbm.xml,其内容如下: 
代码: 

<?xml version="1.0" encoding="GB2312"?> 
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > 
<hibernate-mapping> 

  <class name="person.PersonModel" 
         table="ZY_PERSON"> 
    
    <!--hibernate为我们生成主键id--> 
    <id name="id" type="long"> 
      <generator class="sequence"> 
        <param name="sequence">ZY_PERSON_ID_SEQ</param> 
      </generator> 
    </id> 

    <property name="name"/> 
    <property name="address"/> 
    
  </class> 
</hibernate-mapping> 
 


简单解释 
<class name="person.PersonModel" table="ZY_PERSON"> 
PersonModel这个类对应数据库中ZY_PERSON这个表(现在还没有,后边自动生成) 

<id name="id" type="long"> 
<generator class="sequence"> 
<param name="sequence">ZY_PERSON_ID_SEQ</param> 
</generator> 
</id> 
name="id" 这是类中的id,这里定义它为主键用<id></id>标记,类型为long型,主键用class="sequence"这种形式生成(这适合oracle数据库),ZY_PERSON_ID_SEQ是在oracle数据库中对应的sequence的名称(这个sequence,程序也将自动产生)。 

<property name="name"/> 
<property name="address"/> 
另外的两个成员变量。 

以上是非常简单的配置方式,数据库中的ZY_PERSON将有三个字段,名字与类中的一样,name, address 都将是String型。数据库中字段可以和类中的名称不一样,请参考其他的文章。 

配置都完成了,剩下的工作就是编写测试代码测试hibernate了。 
再休息一会儿。
_________________
侠客行







 时间: 2004-3-03 周三, 下午4:20    标题: Hibernate入门之自己写的小例子的总结(3)   

--------------------------------------------------------------------------------
 
 

(7)最后一步了,  

在hiberante_demo2工程根目录下新建一个sql_out_lib文件夹。 
在JB中新建一个类,包是person,类名TestPersonModel,输入代码,结果如下: 
代码: 

package person; 

import net.sf.hibernate.SessionFactory; 
import net.sf.hibernate.cfg.Configuration; 
import net.sf.hibernate.tool.hbm2ddl.SchemaExport; 



public class TestPersonModel { 
  private static SessionFactory sessionFactory; 
  public static void main(String[] args) throws Exception{ 
    Configuration conf= new Configuration().addClass(PersonModel.class); 

    //第一次运行时用来在数据库中创建表 
    //并且把sql语句输出到txt文件用的 
    //以后的运行要去掉这一段,否则每次都新建表 
    
    SchemaExport dbExport=new SchemaExport(conf); 
    dbExport.setOutputFile("sql_out_lib//sql.txt"); 
    dbExport.create(true, true); 
    


  } 

 

我们已新建了sql_out_lib目录,这里通过SchemaExport 设置一个附加的输出文件,把hibernate生成的sql语句输出一份到sql.txt(这个文件名可随便定义),然后执行create操作。这时候数据库中就建好了ZY_PERSON表和ZY_PERSON_ID_SEQ。 

在JB中再新建一个类,包是person,类名TestPersonModel2,输入代码,结果如下: 
代码: 

package person; 

import net.sf.hibernate.Session; 
import net.sf.hibernate.Transaction; 
import net.sf.hibernate.SessionFactory; 
import net.sf.hibernate.cfg.Configuration; 




public class TestPersonModel2 { 
  private static SessionFactory sessionFactory; 
  public static void main(String[] args) throws Exception{ 
    Configuration conf= new Configuration().addClass(PersonModel.class); 




    //在表中插入第一条数据 

    sessionFactory = conf.buildSessionFactory(); 
    Session s = sessionFactory.openSession(); 

    Transaction t =  s.beginTransaction(); 

    PersonModel p1=new PersonModel(); 
    p1.setName("robin"); 
    p1.setAddress("上海"); 

    //2.持久化 
    s.save(p1); 
    //此时p1已经可以在数据库中找到 
    t.commit(); 

    s.close(); 


  } 

 

这跟用jdbc连数据库一样,Session 相当于connection,Transaction 是事务处理,PersonModel p1不需设id,数据库自动生成。 

在JB中再新建一个类,包是person,类名TestPersonModel3,输入代码,结果如下: 
代码: 

package person; 

import net.sf.hibernate.Session; 
import net.sf.hibernate.SessionFactory; 
import net.sf.hibernate.cfg.Configuration; 
import net.sf.hibernate.Query; 

public class TestPersonModel3 { 
  private static SessionFactory sessionFactory; 
  public static void main(String[] args) throws Exception{ 
    Configuration conf= new Configuration().addClass(PersonModel.class); 

    sessionFactory = conf.buildSessionFactory(); 
    Session s = sessionFactory.openSession(); 
    PersonModel p = new PersonModel(); 
    Query q = s.createQuery("from PersonModel as p where p.id=1"); 
    p = (PersonModel) q.list().get(0); 
    System.out.println(p.getName()); 
    s.close(); 
  } 

 

注意查询语句的写法,查PersonModel类(就是查ZY_PERSON表),起个别名叫小p,where语句查小p的id等于1;q.list()返回List类,再用get(int) 
方法get(0)取第一个结果,我们的查询结果出来了。 

结束了  

(2004.3.15 在本帖后面的回复帖中,我添加了修改和删除的例子,很简单,大家可以看看)
_________________






加入时间: 2003/12/16
文章: 44

¥: 100

 时间: 2004-3-03 周三, 下午4:50    标题: 不得不提的碰到的几个问题   

--------------------------------------------------------------------------------
 
初学hibernate不得不提的可能碰到的几个问题 

(1)*.hbm.xml文件中主键的定义不要弄错了,要选择合适的主键生成方式,错用过<generator class="identity"/>。 

(2)自己写例子时,也从网上拷贝代码下来。class编译无法通过,运行时xml文件中有无法识别的字符,都可能是因为拷贝的代码中有看不见的不合格式的字符,如果有问题仔细检查一下。 

(3)  最大的一个错误,开始做测试时,creat语句,插入语句都执行成功,可是查询语句如何也成功不了,郁闷了好几天,后来还有其他兄弟也遇到同样问题,还问我这个菜鸟,我如之奈何?我要rapidSQL访问数据库creat语句,插入语句,查询语句都可以,说明数据库那边没有任何问题,这边creat语句,插入语句都可以,说明代码没问题,单单一个查询语句出怪子。实在没辙,问了一些高手也没有答复,于是放下了。一次偶然的机会,让我碰到oracle.jdbc.driver.OracleDriver的版本问题,于是想到这儿,原来第一次连接的数据库是Oracle9,版本太高了。 
仅以此鉴与大家共享。
_________________
侠客行 

hibernate入门实例

一、准备工作 1,下载hibernate。地址:http://hibernate.org/orm/downloads/ 2,下载数据库驱动(以MySql为例)。地址:http://www.mysql....
  • passion_wu128
  • passion_wu128
  • 2015年11月30日 00:42
  • 3991

Hibernate学习笔记(一)——简单的Hibernate实例入门

一、Hibernate简介 Hibernate是一个开源的对象/关系映射(ORM)框架,它对JDBC进行了轻量级的封装。所谓ORM就是Object/Relationship Mapping,为什么要...
  • u011024652
  • u011024652
  • 2016年09月19日 20:32
  • 854

菜鸟学习Hibernate——简单的一个例子

一、Hibernate开发。 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类。 为了能够使用Hibernate快速上手,我们先讲解一个简单的Hibernate应用实例hiberna...
  • gwblue
  • gwblue
  • 2014年04月18日 14:56
  • 9141

Hibernate入门学习(一)

Hibernate工作闲暇之余学习入门
  • fb281906011
  • fb281906011
  • 2013年12月28日 15:24
  • 18293

遗传算法入门例子和总结

遗传算法的手工模拟计算示例 为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各     个主要执行步骤。         例:求下述二元函数的最大值:     (1)...
  • geqiandesuyan
  • geqiandesuyan
  • 2017年05月05日 20:47
  • 379

Hibernate框架常用知识点总结

Hibernate配置详解 Hibernate核心详解 Hibernate事务详解 Hibernate多表关系详解
  • shuaicihai
  • shuaicihai
  • 2017年01月16日 09:00
  • 3481

Hibernate学习总结(一)

1、什么是Hibernate Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架(ORM,对象关系映射 Object Relationship mapper) ...
  • u012750846
  • u012750846
  • 2015年09月07日 15:36
  • 729

Hibernate快速入门

Hibernate框架介绍什么是Hibernate我们可以从度娘上摘抄这样有关Hibernate的介绍: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017年03月20日 23:08
  • 1221

【Hibernate】一、Hibernate框架介绍及入门程序示例

Hibernate框架简介 Hibernate是对JDBC的进一步封装。它的一个主要出发点就是希望简化Java对象持久化的编程。因为直接使用JDBC时需要程序员编写大量繁杂的代码。 Hiberna...
  • u010902721
  • u010902721
  • 2016年09月28日 14:28
  • 1044

【SSH进阶之路】Hibernate系列——总结篇(九)

这篇博文是Hibernate系列的最后一篇,既然是最后一篇我们进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通。。。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年11月22日 08:18
  • 16924
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate入门之自己写的小例子的总结 zz
举报原因:
原因补充:

(最多只允许输入30个字)