J度空间

[原创]Hibernate入门(1)

说明下,我也是新手,我现在的目的是为了快速上手Hibernate(以下简称H),因此并没有作深入研究。

参考资料:《Hibernate_Reference》、《深入浅出Hibernate》


正文

下面我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序。

我们所做的第一件事就是创建我们的开发目录,并且把所有需要用到的Java库文件放进去。万幸的是我们有了myeclipse,由他创建的工程可以很方便地打包,然后交给另一个同样拥有myeclipse的使用者,只需要简单的导入即可使用^_^

右键工程目录 → myeclipse → Add Hibernate……

这样子你的工程就可以导入Hibernate所需要的所有库文件,接下来我们创建一个类,用来代表那些我们希望储存在数据库里的event。


1.1
这里假设你已经拥有了一个数据库,并且尽量将数据库中的各种关联设置完毕,如果你能这样子做,接下来的事情将会变得非常简单^_^

打开透视图(perspective)中的myeclipse database exploer

在里面我们要配置下数据源



完成后即可建立连接,然后我们就可以用myec自带的工具进行映射配置,如下图:




1.2

一路默认即可,最后将会生成一堆配置的文件一共有3类:
1.持久化类,就是一个带有一些属性(property)的简单JavaBean类如:

public abstract class AbstractTest implements java.io.Serializable {

    
// Fields

    
private Integer id;

    
private String name;

    
private Set<Testaddr> testaddr = new HashSet<Testaddr>(0);

    
public Set<Testaddr> getTestaddr() {
        
return testaddr;
    }

    
public void setTestaddr(Set<Testaddr> testaddr) {
        
this.testaddr = testaddr;
    }

    
/** default constructor */
    
public AbstractTest() {
    }

    
/** full constructor */
    
public AbstractTest(Integer id, String name) {
        
this.id = id;
        
this.name = name;
    }

    
// Property accessors

    
public Integer getId() {
        
return this.id;
    }

    
public void setId(Integer id) {
        
this.id = id;
    }

    
public String getName() {
        
return this.name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

}

你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。

2.xml映射配置

Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。

一个映射文件的基本结构看起来像这样:


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    
<class name="HibernateFactory.Test" table="test"
        catalog
="himessage">
        
<id name="id" type="java.lang.Integer">
            
<column name="id" />
            
<generator class="native" />
        
</id>
        
<property name="name" type="java.lang.String">
            
<column name="name" not-null="true" />
        
</property>

        
<set name="testaddr" cascade="all" lazy="false" inverse="true">
            
<key column="test_id"></key>
            
<one-to-many class="HibernateFactory.Testaddr" />
        
</set>

    
</class>
</hibernate-mapping>

hibernate-mapping标签(tag)之间, 含有一个class元素。所有的持久化实体类(再次声明,或许接下来会有依赖类,就是那些次要的实体)都需要一个这样的映射,来把类对象映射到SQL数据库里的表。

id元素是标识符属性的声明,name="id" 声明了Java属性的名字 - Hibernate会使用getId()setId()来访问它。 column属性则告诉Hibernate, 我们使用EVENTS表的哪个字段作为主键。嵌套的generator元素指定了标识符生成策略,在这里我们指定native,它根据已配置的数据库自动选择最佳的标识符生成策略。Hibernate支持由数据库生成,全局唯一性(globally unique)和应用程序指定(或者你自己为任何已有策略所写的扩展)这些策略来生成标识符。

关于具体的配置请参阅《深入浅出Hibernate》P146 数据关联,所有的参数表请查此书P411

3.Hibernate配置
现在我们已经有了一个持久化类和它的映射文件,该是配置Hibernate的时候了。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    
<session-factory>
        
<property name="show_sql">true</property>
        
<property name="connection.username">root</property>
        
<property name="connection.url">
            jdbc:mysql://localhost/himessage?useUnicode=true
&amp;amp;characterEncoding=utf-8
        
</property>
        
<property name="dialect">
            org.hibernate.dialect.MySQLDialect
        
</property>
        
<property name="myeclipse.connection.profile">Hb</property>
        
<property name="connection.password">1234</property>
        
<property name="connection.driver_class">
            com.mysql.jdbc.Driver
        
</property>
        
<mapping resource="HibernateFactory/Admin.hbm.xml" />
        
<mapping resource="HibernateFactory/Test.hbm.xml" />
        
<mapping resource="HibernateFactory/Testaddr.hbm.xml" />

    
</session-factory>

</hibernate-configuration>

这里需要特别指出的是<property name="show_sql">true</property>
用了这句我们可以直接在ec控制台看到
Hibernate生成的sql语句,对调试程序是相当有帮助的!

示例的基本框架完成了 - 现在我们可以用Hibernate来做些真正的工作。

1.3
我们终于可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的AdminActionr类:
public class AdminAction {
    
public static void main(String[] args) {
        Session session 
= HibernateSessionFactory.getSession();
        session.beginTransaction();
        Admin admin = new Admin();
        admin.setEmail("tantan85@163.com");
        admin.setName("tantan");
    
    admin.setPsw("111111");
        admin.setAddAdmin(
2);
        session.save(admin);
        session.getTransaction().commit();
    }
}

我们创建了个新的Admin对象并把它传递给Hibernate。现在Hibernate负责与SQL打交道,并把INSERT命令传给数据库。在运行之前,让我们看一下处理SessionTransaction的代码。

一个Session就是个单一的工作单元。我们暂时让事情简单一些,并假设HibernateSession和数据库事务是一一对应的。
HibernateSessionFactory.getSession()是干什么的呢?返回“当前的”工作单元。
getTransaction()则表示取出一个事务对象,commit()则是事务的提交,即将缓存中的数据写入数据库。

就是这么面向对象的方法,你就完成了传统的sql语句的功能,是不是很爽?更爽的是你还可以用hql语言来完成更强大的功能,当然这里不可能一一列举,只有看书了,请参考《深入浅出Hibernate》P173 ^_^

posted on 2007-08-04 20:20 蓝色幽默 阅读(325) 评论(0)  编辑  收藏 所属分类: Hibernate


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿(4)

随笔分类

文章分类

相册

搜索

最新评论