【IT168 技术文档】
2. StudentDAO.java
代码片段5:
这里的构造函数是用来启动Hibernate,并获取session。打开一个session就相当于打开了一个数据库连接,然后我们就可以对这个session进行操作,完成数据库操作,完全不用写SQL语句。我这里Hibernate的启动方式写的很不规范,系统应该只需要完成一次Hibernate启动就可以在不同的DAO中使用,我把它写在构造函数里面纯粹是为了简化演示代码。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;
}
}
你可以看到save和delete方法都很简单直接对对象操作,而findById就有些麻烦,因为这里有一个查询过程在里面。Hibernate里面查询可以用Criteria这个类来完成,我们也常用Hibernate独有的HQL(Hibernate Query Language)来完成查询。当然Hibernate也是支持原生SQL的。关于查询的详细信息请参考其他文章或书籍,我只是演示一个流程,介绍一些概念。
3. Student.hbm.xml
代码片段6:
这个文件定义了Student类和Student表是如何映射的。class元素定义了Sudent类和STUDENT表映射,然后就定义了各个属性是如何映射的。如果一个属性是数据库的key,那么会用id标签来定义,column定义了当前类的属性和数据库中的哪个字段对应,generator是id特有的。一般来说id是自增的,由于我的数据库是用的Oracle,它没有自增字段,要实现自增必须用Sequence,这超出了本文的范围,所以我就用assigned来简化示例代码。assigned表示id是用户给定的。<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>
有一个比较特别的标签是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>
