zoukankan      html  css  js  c++  java
  • Hibernate参考文档学习笔记——Hibernate入门(一)

    本人小菜鸟一只,无技术无文笔,写此博客只为记录学习,不求教书育人,也没有能力达到如此高的境界,只求技术成长,如有共同学习的朋友可以一起讨论,也希望得到大牛的批评和建议,先谢过各位点击了本博客的朋友。


    “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 }
    View Code

    注意:

    (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>
    View Code

    5Hibernate配置

    通过配置文件将应用程序与数据库连接,配置数据库的相关属性。此外,还要添加映射文件资源,使得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>
    View Code

    上图配置并不是包含所有内容,其他配置有待查阅资料,又是一个小作业,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 }
    View Code

    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 }
    View Code

    按上述步骤操作完成,运行后 出现下面异常:

    出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。

    出现这个错误,是因为缺少JTA的Jar包,添加上即可,由于我也不知道哪些是必须的就添加了libprovided目录下的所有Jar包

    修正上述两个错误后,运行成功

  • 相关阅读:
    python多线程编程(6): 队列同步
    Python验证Url地址的正则表达式
    centos下redis安全配置相关
    redis
    mysql安装 配置
    centos7安装python3 环境变量配置 django安装 以及tab补全功能
    saltstack 与常用服务部署
    vim
    Linux系统基础优化及常用命令
    Shell 基本命令
  • 原文地址:https://www.cnblogs.com/forgive/p/3343560.html
Copyright © 2011-2022 走看看