简述Hibernate 3中的XML持久性(Hibernate 3 XML持久化详解与实践)
原创Hibernate 3中的XML持久性详解与实践
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者方便地将 Java 对象映射到数据库表。Hibernate 3 提供了多种映射对象到数据库的方法,其中之一是通过 XML 文件进行持久化配置。本文将详细介绍 Hibernate 3 中的 XML 持久性,以及怎样实践 XML 持久化。
1. XML持久性的概念
在 Hibernate 中,XML 持久性指的是使用 XML 文件来定义对象关系映射(ORM)的元数据。这些 XML 文件通常被称为映射文件,它们描述了 Java 类与数据库表之间的映射关系。通过 XML 映射文件,Hibernate 能够知道怎样将对象的状态持久化到数据库中,以及怎样从数据库中恢复对象状态。
2. 映射文件的结构
映射文件通常具有以下基本结构:
<?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">
<hibernate-mapping>
<class name="com.example.MyEntity" table="my_table">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="string"/>
<property name="value" column="value" type="float"/>
...
</class>
</hibernate-mapping>
在这个结构中,我们定义了一个名为 <hibernate-mapping>
的根元素,它包含了所有的映射信息。每个 <class>
元素代表一个 Java 类与数据库表之间的映射关系,其中:
name
属性指定了 Java 类的完全限定名。table
属性指定了对应的数据库表名。
在 <class>
元素内部,我们可以定义 <id>
和 <property>
元素来映射类的属性和字段到数据库表的列。
3. 主键映射
主键映射是映射文件中非常重要的部分,它定义了怎样处理对象的主键。以下是一个主键映射的例子:
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
在这个例子中,<id>
元素定义了名为 id
的属性作为主键,它映射到数据库表中的 id
列。类型为 java.lang.Integer
。<generator>
元素定义了主键的生成策略,这里使用的是 native
策略,它允许 Hibernate 使用数据库的内置主键生成策略。
4. 属性映射
属性映射定义了怎样将类的属性映射到数据库表的列。以下是一个属性映射的例子:
<property name="name" column="name" type="string"/>
<property name="value" column="value" type="float"/>
在这个例子中,<property>
元素定义了两个属性:name
和 value
。它们分别映射到数据库表的 name
和 value
列。类型分别为 string
和 float
。
5. 相关性映射
相关性映射用于定义实体之间的相关性关系,如一对多、多对一、多对多等。以下是一个多对一相关性映射的例子:
<class name="com.example.Order" table="orders">
...
<many-to-one name="customer" class="com.example.Customer" column="customer_id" lazy="true"/>
</class>
在这个例子中,<many-to-one>
元素定义了 Order
类与 Customer
类之间的多对一相关性。属性 name
指定了相关性属性名,class
指定了相关性的类,column
指定了数据库表中的外键列。
6. XML持久化的实践
下面将通过一个明了的例子来演示怎样使用 Hibernate 3 的 XML 持久性。
6.1 创建映射文件
首先,创建一个名为 User.hbm.xml
的映射文件,用于映射 User
类到数据库表。
<?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">
<hibernate-mapping>
<class name="com.example.User" table="users">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="username" column="username" type="string"/>
<property name="password" column="password" type="string"/>
</class>
</hibernate-mapping>
6.2 配置 Hibernate
然后,在 Hibernate 配置文件 hibernate.cfg.xml
中添加映射文件的引用。
<?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">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/example/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
6.3 编写实体类
接下来,编写 User
实体类。
package com.example;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Integer id;
private String username;
private String password;
// Getters and setters
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
6.4 编写测试代码
最后,编写测试代码来验证映射是否圆满。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateTest {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
User user = new User();
user.setUsername("admin");
user.setPassword("password");
session.save(user);
session.getTransaction().commit();
session.close();
}
}
运行上述测试代码,Hibernate 将通过映射文件和配置文件创建数据库表,并将 User
对象持久化到数据库中。
7. 总结
Hibernate 3 的 XML 持久性为开发者提供了一种灵活的行为来定义对象关系映射。通过 XML 映射文件,开发者可以精确地控制对象与数据库表之间的映射关系。虽然 XML 映射文件大概会提高配置的工作量,但它提供了强劲的映射能力和灵活性,促使 Hibernate 在处理繁复的映射关系时更加得心应手。在实际开发中,开发者可以通过项目的需求选择合适的映射行为,以实现高效的对象关系映射。
本文详细介绍了 Hibernate 3 中的 XML 持久性,并通过一个明了的例子演示了怎样使用 XML 映射文件进行持久化配置。通过这个例子,开发者可以更好地懂得 Hibernate XML 持久性的原理和实践。