技术开发 频道

Hibernate快速入门教程


【IT168 技术文档】
  2.    StudentDAO.java
  代码片段5:
public class StudentDAO { Session session; public StudentDAO() { Configuration cfg = new Configuration(); cfg.configure("/hibernate.cfg.xml"); SessionFactory sessionFactory = cfg.buildSessionFactory(); session = sessionFactory.openSession(); } public void save(Student transientInstance) { session.save(transientInstance); } public void delete(Student persistentInstance) { session.delete(persistentInstance); } public Student findById(java.lang.String id) { List list = session.createCriteria(Student.class).add( Expression.eq("id", id)).list(); if (list.size() > 0) { return (Student)list.get(0); } return null; } }
这里的构造函数是用来启动Hibernate,并获取session。打开一个session就相当于打开了一个数据库连接,然后我们就可以对这个session进行操作,完成数据库操作,完全不用写SQL语句。我这里Hibernate的启动方式写的很不规范,系统应该只需要完成一次Hibernate启动就可以在不同的DAO中使用,我把它写在构造函数里面纯粹是为了简化演示代码。
你可以看到save和delete方法都很简单直接对对象操作,而findById就有些麻烦,因为这里有一个查询过程在里面。Hibernate里面查询可以用Criteria这个类来完成,我们也常用Hibernate独有的HQL(Hibernate Query Language)来完成查询。当然Hibernate也是支持原生SQL的。关于查询的详细信息请参考其他文章或书籍,我只是演示一个流程,介绍一些概念。

  3.    Student.hbm.xml
  代码片段6:
<hibernate-mapping>
    <class name="Student" table="STUDENT">
        <id name="id" type="string">
            <column name="ID" length="10" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <set name="courseSelections" inverse="true">
            <key>
                <column name="STUDENT_ID" length="10"
not-null="true" />
            </key>
            <one-to-many class="CourseSelection" />
        </set>
    </class>
</hibernate-mapping> 
  这个文件定义了Student类和Student表是如何映射的。class元素定义了Sudent类和STUDENT表映射,然后就定义了各个属性是如何映射的。如果一个属性是数据库的key,那么会用id标签来定义,column定义了当前类的属性和数据库中的哪个字段对应,generator是id特有的。一般来说id是自增的,由于我的数据库是用的Oracle,它没有自增字段,要实现自增必须用Sequence,这超出了本文的范围,所以我就用assigned来简化示例代码。assigned表示id是用户给定的。
有一个比较特别的标签是set,它对应着数据库中的外键关系,上文我提到的通过Student对象可以获得所有相关的选课记录就是通过这里的定义实现的。name属性对应了Student类中的字段名,key表示哪个字段是外键,one-to-many表示Student和CourseSelection是一对多关系,这和事实相符。类似的还有many-to-one,many-to-many,不过这些都不常用,我不介绍了。Hibernate根据这个映射定义文件,在实例化一个POJO(比如Student)的时候,会自动的把定义过映射的属性用数据库中的数据填充,set也包括在内。

  4.    hibernate.cfg.xml
  代码片段7:
<hibernate-configuration> <session-factory> <property name="connection.username">test</property> <property name="connection.url"> jdbc:oracle:thin:@10.85.33.199:1521:glee</property> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect</property> <property name="connection.password">test</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver</property> <mapping resource="Student.hbm.xml"></mapping> <mapping resource="CourseSelection.hbm.xml"></mapping> <mapping resource="Course.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
0
相关文章