一些在Hibernate学习中应该注意的问题

来源:互联网 发布:国家统计局cpi数据 编辑:程序博客网 时间:2024/05/21 17:42

一些在Hibernate学习中应该注意的问题

一.          包的引入

注意Hibernate包的引入(包的引入是学习每个开发框架都必须注意的问题),在不能确定用到哪个包时(特别是对于新手),建议把Hibernate/lib里面的包和hibernate2.jar全部引入.还有用于连接数据库的包(这个随情况而定。我用mysqlmysql-connector-java-3.0.14-production-bin.jar)。

二.          配置文件hibernate.cfg.xml的书写

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

          "-//Hibernate/Hibernate Configuration DTD 2.0//EN"

    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<!-- DO NOT EDIT: This is a generated file that is synchronized -->

<!-- by MyEclipse Hibernate tool integration.                   -->

<hibernate-configuration>

       <session-factory>

              <!-- properties -->

              <property name="hibernate.connection.username">root</property>

              <property name="hibernate.connection.url">

                     jdbc:mysql://192.168.151.72:3306/quickstart

              </property>

              <property name="dialect">

                     net.sf.hibernate.dialect.MySQLDialect

              </property>

              <property name="hibernate.connection.password"></property>

              <property name="hibernate.connection.driver_class">

                     com.mysql.jdbc.Driver

              </property>

              <!-- mapping files -->

              <!-- The following mapping element was auto-generated in -->

              <!-- order for this file to conform to the Hibernate DTD -->

              <mapping resource="Customer.hbm.xml" />

 

       </session-factory>

</hibernate-configuration>

配置文件中的前半部分是用来配置数据库连接池的(建议新手是用Hibernate自带的连接池配置比较简单。高手可以是用别的连接池-tomcat,struts,jboss的)

最后一句“<mapping resource="Customer.hbm.xml" />”则是用来指明表的配置文件的,形式如下:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"

        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

       <class name="com.ln.hb.Customer" table="CUSTOMER">

              <id name="id" column="CID">

                     <generator class="identity" />

              </id>

              <property name="username" column="USERNAME" />

              <property name="password" column="PASSWORD" />

       </class>

</hibernate-mapping>

在这个配置文件中,class标签是用来建立一个表到类的映射,如上例则是说明在com.ln.hb包下的Customer类与数据库里的CUSTOMER表建立了映射关系。Class标签的子标签:

1.Id是用来指明主键的,<generator class=" " />这是用来指明主键的生成机制,有如下可选项:

选项说明:

1) Assigned

由外部程序负责生成,无需Hibernate参与。

2) hilo

hi/lo 算法实现的主生成机制,需要外的数据表保存主

生成史状

3) seqhilo

hilo 似,通hi/lo 算法实现的主生成机制,只是主键历

保存在Sequence中,用于支持Sequence的数据,如Oracle

4) increment

按数值顺增。此方式的实现机制在当前例中

一个量,以保存着当前的最大,之后次需要生成主

将此1

这种方式可能生的问题是:如果当前有多个访问同一个数据

,那由于各个例各自维护,不同例可能生成同

的主,从而造成主常。因此,如果同一数据有多个

访问,此方式必避免使用。

5) identity

采用数据提供的主生成机制。如DB2SQL ServerMySQL

中的主生成机制。

6) sequence

采用数据提供的sequence 机制生成主。如Oralce 中的

Sequence

7) native

Hibernate根据底数据自行判断采用identityhilosequence

其中一生成方式。

8) uuid.hex

Hibernate基于128 位唯一值产生算法生成16 制数编码

32 的字符串表示)作

9) uuid.string

uuid.hex似,只是生成的主编码16)。在某些

数据中可能出现问题(如PostgreSQL)。

10) foreign

使用外部表的字段作

一般而言,利用uuid.hex 方式生成主将提供最好的性能和数据平台

性。

外由于常用的数据,如OracleDB2SQLServerMySql 等,都提

供了易用的主生成机制(Auto-Increase 字段或者Sequence)。我可以在数

提供的主生成机制上,采用generator-class=native的主生成方式。

过值得注意的是,一些数据提供的主生成机制在效率上未必最佳,

大量并insert数据可能会引起表之的互

数据提供的主生成机制,往往是通在一个内部表中保存当前主

(如于自增型主而言,此内部表中就维护着当前的最大增量),

之后次插入数据会个最大,然后加上增量作记录的主,之

后再把个新的最大更新回内部表中,这样,一次Insert操作可能致数据

内部多次表写操作,同伴随的有数据的加操作,这对性能

大影

因此,于并Insert要求高的系,推荐采用uuid.hex 生成

机制。

2.“<property name="username" column="USERNAME" />”这是对其他的属性建立映射。

 

 

三. 持久化类的书写

与一般的formbean类书写形式一样,定义属性,及其gettersetter方法。(注意属性名字与配置文件的属性项name定义的名字要一致)如下例:

package com.ln.hb;

import java.io.Serializable;

public class Customer implements Serializable {

       private int id;

       private String username;

       private String password;

       public int getId() {

              return id;

       }

       public String getPassword() {

              return password;

       }

       public String getUsername() {

              return username;

       }

       public void setId(int id) {

              this.id = id;

       }

       public void setPassword(String password) {

              this.password = password;

       }

       public void setUsername(String username) {

              this.username = username;

       }

}

 

 

. 测试类的书写(Hibernate的调用)

package com.ln.test;

 

import java.util.Iterator;

 

import com.ln.hb.Customer;

 

import net.sf.hibernate.HibernateException;

import net.sf.hibernate.Query;

import net.sf.hibernate.Session;

import net.sf.hibernate.SessionFactory;

import net.sf.hibernate.Transaction;

import net.sf.hibernate.cfg.Configuration;

 

public class Test {

 

       public static void main(String[] args) {

 

              try {

                     SessionFactory sf = new Configuration().configure()

                                   .buildSessionFactory();

//上面的写法是读默认的hibernate.cfg.xml

                     Session session = sf.openSession();

                     Transaction tx = session.beginTransaction();

                     Customer customer = new Customer();

                     System.out.println("Let's go!");

//                   customer.setUsername("liang");

//                   customer.setPassword("hello");

//                   session.save(customer);

//                   session.flush();

                     Query query = session.createQuery("select customer from Customer as customer");

                     for (Iterator it = query.iterate(); it.hasNext();) {

                            Customer cust = (Customer) it.next();

                            System.out.print("********"+"UserName: " + cust.getUsername()+"********");

                            System.out.println("PassWord: " + cust.getPassword()+"********");

                     }

                     tx.commit();

                     session.close();

 

              } catch (HibernateException e) {

                     e.printStackTrace();

              }

       }

}

五.数据库表的设计中要注意的事项。

1.由于在Hibernate初级阶段要尽量避免对主键值进行手动设置、修改。所以建议把主键设置成auto_increment(就是能自动加一的形式)且不能为空的格式。

2.在下面附上使用tomcat连接池的例子:

上面配置的东西只用对hibernate.cfg.xml进行一些修改。修改后的hibernate.cfg.xml如下:

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

          "-//Hibernate/Hibernate Configuration DTD 2.0//EN"

      "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<!-- DO NOT EDIT: This is a generated file that is synchronized -->

<!-- by MyEclipse Hibernate tool integration.                   -->

<hibernate-configuration>

       <session-factory>

              <!-- properties -->

              <!-- <property name="hibernate.connection.username">root</property>

              <property name="hibernate.connection.url">

                     jdbc:mysql://localhost:3306/quickstart

              </property>-->

              <property name="connection.datasource">java:comp/env/jdbc/mysql</property>

这里就是用来连接tomcat(或其他)连接池的地方,property的内容是你所配置的连接池的jndi名称。

              <property name="dialect">

                     net.sf.hibernate.dialect.MySQLDialect

              </property>

              <!--<property name="hibernate.connection.password"></property>-->

              <property name="hibernate.connection.driver_class">

                     com.mysql.jdbc.Driver

              </property>

              <!-- mapping files -->

              <!-- The following mapping element was auto-generated in -->

              <!-- order for this file to conform to the Hibernate DTD -->

              <mapping resource="com/ln/hb/Customer.hbm.xml" />

       </session-factory>

</hibernate-configuration>

 

tomcat的连接池配置如下(在指向你的工程的yourProject.xml里面进行配置):

<?xml version='1.0' encoding='utf-8'?>

<Context

path="/hb2" docBase="eclipse /workspace/Hbstruts" reloadable="true">

  <Resource type="javax.sql.DataSource" name="jdbc/mysql"/>

  <ResourceParams name="jdbc/mysql">

    <parameter>

      <name>maxWait</name>

      <value>5000</value>

    </parameter>

    <parameter>

      <name>maxActive</name>

      <value>4</value>

    </parameter>

    <parameter>

      <name>password</name>

      <value></value>

    </parameter>

    <parameter>

      <name>url</name>

      <value>jdbc:mysql://localhost:3306/quickstart</value>

    </parameter>

    <parameter>

      <name>driverClassName</name>

      <value>com.mysql.jdbc.Driver</value>

    </parameter>

    <parameter>

      <name>maxIdle</name>

      <value>2</value>

    </parameter>

    <parameter>

      <name>username</name>

      <value>root</value>

    </parameter>

  </ResourceParams>

</Context>

原创粉丝点击