本人小菜鸟一只,无技术无文笔,写此博客只为记录学习,不求教书育人,也没有能力达到如此高的境界,只求技术成长,如有共同学习的朋友可以一起讨论,也希望得到大牛的批评和建议,先谢过各位点击了本博客的朋友。
“Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。” ——百度百科
今天的学习任务就是第一个Hibernate应用程序,希望通过第一个应用,可以大致了解Hibernate的功能和作用。
1、获取Hibernate
既然要使用Hibernate来开发应用,那么就必须先获取Hibernate的发布包,我们可以从网站http://sourceforge.net/projects/hibernate/files/中下载自己需要的版本,我下载的是hibernate-search-4.4.0.Alpha2。
下载完成,解压后得到以下内容:
2、创建Hibernate项目,添加Jar包
创建一个Java Project,建好项目之后,需要添加上Hibernate运行所必须的Jar包,如果不知道哪些可以不添加就直接添加lib equired中的所有Jar包,如果清楚的知道每个包的作用就可以进行相应的删减。
具体每个包的作用还不明白,需要进一步明确,算是留下一个作业给自己吧,O(∩_∩)O
3、创建持久化类
1 package events; 2 3 import java.util.Date; 4 5 public class Event { 6 private Long id; 7 private String title; 8 private Date date; 9 10 public Event() { 11 } 12 13 public Long getId() { 14 return id; 15 } 16 17 private void setId(Long id) { 18 this.id = id; 19 } 20 21 public Date getDate() { 22 return date; 23 } 24 25 public void setDate(Date date) { 26 this.date = date; 27 } 28 29 public String getTitle() { 30 return title; 31 } 32 33 public void setTitle(String title) { 34 this.title = title; 35 } 36 37 }
注意:
(1)无参构造函数的作用是用于Hibernate通过反射机制来实例化类对象的时候。
(2)在所有的持久化实体类中都需要一个唯一的标识符属性。
(3)通常不会操作对象的标识(identity),因此它的setter方法的访问级别应该声明private。这样当对象被保存的时候,只有Hibernate可以为它分配标识符值。
4、映射文件
映射文件的作用就是告诉Hibernate应该访问哪个数据库(database)中的哪张表(table)的哪些字段(column)。
映射文件应该保存在持久类的源文件目录下,映射文件可随意地命名,但hbm.xml的后缀已成为Hibernate开发者社区的约定。
本例用到的映射文件如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="events"> 6 <class name="Event" table="EVENTS"> 7 <!-- id用于标示标识符属性,即数据表的主键,name对应实体中的属性名,column对应数据表中的字段名--> 8 <id name="id" column="EVENT_ID"> 9 <!-- 配置标识符的生成策略 --> 10 <generator class="native" /> 11 </id> 12 13 <!-- property标示实体类中的非标识符属性, 14 type指定Hibernate 映射类型,它们能使Java数据类型与SQL数据类型相互转换 15 16 --> 17 <property name="date" type="timestamp" column="EVENT_DATE" /> 18 <!-- 若不指定column属性,则表示实体对象的属性名即为数据表中字段的名称 --> 19 <property name="title" /> 20 </class> 21 </hibernate-mapping>
5、Hibernate配置
通过配置文件将应用程序与数据库连接,配置数据库的相关属性。此外,还要添加映射文件资源,使得Hibernate能够找到映射文件,并将映射文件与实体类关联。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 设置连接数据库的驱动 --> 8 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 9 <!-- 设置数据库服务器的连接路径 --> 10 <property name="connection.url">jdbc:mysql://localhost:3306/db</property> 11 <!-- 设置数据库服务器的连接用户 --> 12 <property name="connection.username">root</property> 13 <!-- 设置数据库服务器的连接用户的密码 --> 14 <property name="connection.password">Lynn0714</property> 15 <!-- 数据库连接池大小 --> 16 <property name="connection.pool_size">1</property> 17 <!-- SQL方言,要根据使用的数据库来配置 --> 18 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 19 <!-- 设置Hibernate的自动session管理 --> 20 <property name="current_session_context_class">thread</property> 21 <!-- 设置二级cache --> 22 <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 23 <!-- 设置运行时是否显示调用的SQL语句 --> 24 <property name="show_sql">true</property> 25 <!-- Drop and re-create the database schema on startup --> 26 <property name="hbm2ddl.auto">create</property> 27 28 <!-- 使用的映射文件 --> 29 <mapping resource="events/events.hbm.xml" /> 30 </session-factory> 31 </hibernate-configuration>
上图配置并不是包含所有内容,其他配置有待查阅资料,又是一个小作业,O(∩_∩)O
上图配置了Hibernate的SessionFactory
,一个关联于特定数据库全局的工厂(factory)。如果你要使用多个数据库,就要用多个的<session-factory>
,通常把它们放在多个配置文件中。(Hibernate如何识别是在何时使用哪个配置文件?)
6、用Ant构建
此处Ant操作全部仿照操作,不知道具体如何使用。
7、启动和辅助类
在这个环节中,需要创建一个全局的SessionFactory,通过SessionFactory来创建并打开Session,一个Session代表一个单线程的单元操作,SessionFactory则是个线程安全的全局对象,只需要被实例化一次。
1 package util; 2 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 6 public class HibernateUtil { 7 private static final SessionFactory sessionFactory; 8 9 static{ 10 try{ 11 sessionFactory = new Configuration().configure().buildSessionFactory(); 12 }catch(Throwable ex){ 13 System.err.println("初始化SessionFactory失败"+ex); 14 throw new ExceptionInInitializerError(ex); 15 } 16 } 17 18 public static SessionFactory getSessionFactory(){ 19 return sessionFactory; 20 } 21 }
8、加载并存储对象
1 package events; 2 3 import java.util.Date; 4 5 import org.hibernate.Session; 6 7 import util.HibernateUtil; 8 9 public class EventManager { 10 public static void main(String[] args) { 11 EventManager mgr = new EventManager(); 12 13 if (args[0].equals("store")) { 14 mgr.createAndStoreEvent("My Event", new Date()); 15 } 16 17 HibernateUtil.getSessionFactory().close(); 18 } 19 20 private void createAndStoreEvent(String title, Date theDate) { 21 Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 22 session.beginTransaction(); 23 24 Event theEvent = new Event(); 25 theEvent.setTitle(title); 26 theEvent.setDate(theDate); 27 28 session.save(theEvent); 29 30 session.getTransaction().commit(); 31 } 32 33 }
按上述步骤操作完成,运行后 出现下面异常:
出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。
出现这个错误,是因为缺少JTA的Jar包,添加上即可,由于我也不知道哪些是必须的就添加了libprovided目录下的所有Jar包
修正上述两个错误后,运行成功