<%@ page contentType="text/html; charset=gb2312"%> Hibernate入门之自己写的小例子的总结
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
Hibernate入门之自己写的小例子的总结
     发布者: 发布时间:2007-07-27

俺是新学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方法,代码结果如下:

代码
  1. package person;   
  2.   
  3. import java.io.Serializable;   
  4.   
  5. public class PersonModel implements Serializable {   
  6.   private Long id;   
  7.   private String name;   
  8.   private String address;   
  9.   public Long getId() {   
  10.     return id;   
  11.   }   
  12.   public void setId(Long id) {   
  13.     this.id = id;   
  14.   }   
  15.   public void setName(String name) {   
  16.     this.name = name;   
  17.   }   
  18.   public String getName() {   
  19.     return name;   
  20.   }   
  21.   public void setAddress(String address) {   
  22.     this.address = address;   
  23.   }   
  24.   public String getAddress() {   
  25.     return address;   
  26.   }   
  27.   
  28. }   

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




声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。
相关文章:   hibernate入门篇之新增功能_4:many-to-many   hibernate入门篇之新增功能_3:one-to-many
评论    共 58 条 发表评论
vatful     2004-03-03 15:40

上边做好了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数据源连接的位置,这是默认的数据源连接。

代码
  1. ## HypersonicSQL   
  2.   
  3. hibernate.dialect net.sf.hibernate.dialect.HSQLDialect   
  4. hibernate.connection.driver_class org.hsqldb.jdbcDriver   
  5. hibernate.connection.username sa   
  6. hibernate.connection.password   
  7. #hibernate.connection.url jdbc:hsqldb:hsql://localhost   
  8. hibernate.connection.url jdbc:hsqldb:test   

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

代码
  1. ## HypersonicSQL   
  2.   
  3. #hibernate.dialect net.sf.hibernate.dialect.HSQLDialect   
  4. #hibernate.connection.driver_class org.hsqldb.jdbcDriver   
  5. #hibernate.connection.username sa   
  6. #hibernate.connection.password   
  7. #hibernate.connection.url jdbc:hsqldb:hsql://localhost   
  8. #hibernate.connection.url jdbc:hsqldb:test   

再找到

代码
  1. ## Oracle   
  2.   
  3. #hibernate.dialect net.sf.hibernate.dialect.OracleDialect   
  4. #hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver   
  5. #hibernate.connection.username ora   
  6. #hibernate.connection.password ora   
  7. #hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test   

这是Oracle数据源连接

去掉注释,修改为

代码
  1. ## Oracle   
  2.   
  3. hibernate.dialect net.sf.hibernate.dialect.OracleDialect   
  4. hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver   
  5. hibernate.connection.username your_database_username   
  6. hibernate.connection.password your_database_password   
  7. 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,其内容如下:

代码
  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >  
  3. <hibernate-mapping>  
  4.   
  5.   <class name="person.PersonModel"  
  6.          table="ZY_PERSON">  
  7.       
  8.     <!--hibernate为我们生成主键id-->  
  9.     <id name="id" type="long">  
  10.       <generator class="sequence">  
  11.         <param name="sequence">ZY_PERSON_ID_SEQ</param>  
  12.       </generator>  
  13.     </id>  
  14.   
  15.     <property name="name"/>  
  16.     <property name="address"/>  
  17.        
  18.   </class>  
  19. </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了。
再休息一会儿。

vatful     2004-03-03 16:20

:P

(7)最后一步了,

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

代码
  1. package person;   
  2.   
  3. import net.sf.hibernate.SessionFactory;   
  4. import net.sf.hibernate.cfg.Configuration;   
  5. import net.sf.hibernate.tool.hbm2ddl.SchemaExport;   
  6.   
  7. public class TestPersonModel {   
  8.   private static SessionFactory sessionFactory;   
  9.   public static void main(String[] args) throws Exception{   
  10.     Configuration conf= new Configuration().addClass(PersonModel.class);   
  11.   
  12.     //第一次运行时用来在数据库中创建表   
  13.     //并且把sql语句输出到txt文件用的   
  14.     //以后的运行要去掉这一段,否则每次都新建表   
  15.        
  16.     SchemaExport dbExport=new SchemaExport(conf);   
  17.     dbExport.setOutputFile("sql_out_lib\\sql.txt");   
  18.     dbExport.create(truetrue);   
  19.        
  20.   
  21.   }   
  22. }   

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

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

代码
  1. package person;   
  2.   
  3. import net.sf.hibernate.Session;   
  4. import net.sf.hibernate.Transaction;   
  5. import net.sf.hibernate.SessionFactory;   
  6. import net.sf.hibernate.cfg.Configuration;   
  7.   
  8. public class TestPersonModel2 {   
  9.   private static SessionFactory sessionFactory;   
  10.   public static void main(String[] args) throws Exception{   
  11.     Configuration conf= new Configuration().addClass(PersonModel.class);   
  12.   
  13.     //在表中插入第一条数据   
  14.   
  15.     sessionFactory = conf.buildSessionFactory();   
  16.     Session s = sessionFactory.openSession();   
  17.   
  18.     Transaction t =  s.beginTransaction();   
  19.   
  20.     PersonModel p1=new PersonModel();   
  21.     p1.setName("robin");   
  22.     p1.setAddress("上海");   
  23.   
  24.     //2.持久化   
  25.     s.save(p1);   
  26.     //此时p1已经可以在数据库中找到   
  27.     t.commit();   
  28.   
  29.     s.close();   
  30.   
  31.   }   
  32. }   

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

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

代码
  1. package person;   
  2.   
  3. import net.sf.hibernate.Session;   
  4. import net.sf.hibernate.SessionFactory;   
  5. import net.sf.hibernate.cfg.Configuration;   
  6. import net.sf.hibernate.Query;   
  7.   
  8. public class TestPersonModel3 {   
  9.   private static SessionFactory sessionFactory;   
  10.   public static void main(String[] args) throws Exception{   
  11.     Configuration conf= new Configuration().addClass(PersonModel.class);   
  12.   
  13.     sessionFactory = conf.buildSessionFactory();   
  14.     Session s = sessionFactory.openSession();   
  15.     PersonModel p = new PersonModel();   
  16.     Query q = s.createQuery("from PersonModel as p where p.id=1");   
  17.     p = (PersonModel) q.list().get(0);   
  18.     System.out.println(p.getName());   
  19.     s.close();   
  20.   }   
  21. }   

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

结束了

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

vatful     2004-03-03 16:50

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

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

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

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

togetherj     2004-03-05 21:14

精彩,感谢楼主,我是初学,受益非浅^_^

vatful     2004-03-08 12:36

嘿嘿,愧不敢当

huisky     2004-03-09 16:17

谢谢楼主的共享精神!支持UP~~~

vatful     2004-03-10 14:15

谢谢huisky的支持。

这段时间仍然在看hibernate,
如果有新的笔记出来,
一定与大家一起共享。

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
Struts+spring+hibernate学习笔记!
spring入门编程问题集锦
Spring大探宝
学习Spring的小小心得(重新整理版)
应用Hibernate3的DetachedCriteria实现分页查询
怎样用spring来重构这样一个遗留系统?
 
最近评论:
        
鍥炲
        
那个雨天的想法!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(6033)
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(266)
        
快乐情人节!
wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap. max(9995)
        
昨夜的狂想曲!
wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(7019)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(5373)
        
不想在乎你!
dofus kamas,dofus kamas,EVE ISK,dog shoes,pet supply, max(6524)
        
天天思念你!
guildwars gold,guild wars gold,guild wars gold,lotro gold, max(873)
        
我想告诉你!
final fantasy xi gil,final fantasy xi gil,final fantasy xi gil,world of warcraft gold,cheap world of warcraft gold max(349)
        
我想告诉你!
final fantasy xi gil,final fantasy xi gil,final fantasy xi gil,world of warcraft gold,cheap world of warcraft gold max(511)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号