Hibernate与XDoclet:高效的代码生成与映射管理
立即解锁
发布时间: 2025-08-19 02:20:14 阅读量: 2 订阅数: 9 


专业Hibernate:Java持久化解决方案
### Hibernate与XDoclet:高效的代码生成与映射管理
#### 1. 生成Hibernate配置文件
`<hibernatecfg>`子任务需要接收多个属性。由于我们计划让Hibernate连接一个基于Hypersonic的进程外数据库,因此配置其使用URL `jdbc:hsqldb:hsql://localhost` 连接数据库,同时使用Hypersonic数据库的默认用户名和密码。
`<hibernatecfg>`需要知道哪些Java类是Hibernate类。通过在类中添加`@hibernate.class`标签,可将普通类与Hibernate类区分开来,示例如下:
```java
/**
*
* @author Eric Pugh
*
* @hibernate.class
*/
public class Survey {
}
```
`<hibernatecfg>`会解析所有源文件,将带有`@hibernate.class`属性的类作为`<mapping>`添加到`hibernate.cfg.xml`文件中。
运行`build2.xml`中的Hibernate任务来生成`hibernate.cfg.xml`文件,命令如下:
```bash
ant –f build2.xml hibernate
```
运行结果示例如下:
```plaintext
C:\clients\book\13\survey>ant -f build2.xml hibernate
Buildfile: build2.xml
init:
[echo] Build survey-om-chapter13
hibernate:
[hibernatedoclet] 0 [main] INFO XDocletMain.start - Running <hibernatecfg/>
[hibernatedoclet] Generating hibernate.cfg.xml file
[hibernatedoclet] 150 [main] INFO XDocletMain.start - Running <hibernate/>
[hibernatedoclet] Generating mapping file for example.survey.Survey.
[hibernatedoclet] example.survey.Survey
BUILD SUCCESSFUL
Total time: 1 second
```
生成的`hibernate.cfg.xml`文件位于`/build/classes/`目录下,内容如下:
```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">
<!-- Generated file - Do not edit! -->
<hibernate-configuration>
<!-- a SessionFactory instance listed as /jndi/name -->
<session-factory>
<!-- properties -->
<property
name="dialect">net.sf.hibernate.dialect.HSQLDialect</property>
<property name="show_sql">false</property>
<property name="use_outer_join">false</property>
<property name="connection.username">sa</property>
<property
name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql:survey</property>
<!-- mapping files -->
<mapping resource="example/survey/Survey.hbm.xml"/>
</session-factory>
</hibernate-configuration>
```
XDoclet在文件中插入了`Generated file - Do not edit!`注释,提醒开发者不要直接编辑该文件。同时,Ant子任务传入的所有属性都用于提供Hibernate创建JDBC连接所需的信息。带有`@hibernate.class`标签的`Survey` Java类,其对应的映射文件也被添加为映射。随着更多文件添加`@hibernate.class`标签,它们也会被添加到`hibernate.cfg.xml`中。
#### 2. 为JBoss生成MBean描述符文件
JBoss是一个基于Java管理扩展(JMX)API设计的开源应用服务器。JMX是为Java应用程序和组件提供管理接口的标准API。更多关于JBoss的信息可访问[http://www.jboss.org](http://www.jboss.org)。
JBoss可以通过读取特殊的MBean描述符文件来管理Hibernate数据库连接信息。虽然可以手动生成这个XML文件,但需要大量已有数据,因此很适合使用代码生成。下面通过`<jbossservice>` Ant任务展示XDoclet如何提供帮助。
`<jbossservice>`任务与`<hibernatecfg>`任务非常相似:
```xml
<hibernatecfg
jdbcUrl="jdbc:hsqldb:hsql:survey"
driver="org.hsqldb.jdbcDriver"
dialect="net.sf.hibernate.dialect.HSQLDialect"
userName="sa"
password=""
/>
<hibernate version="2.0" />
<jbossservice
destdir="${build.dir}"
jndiname="java:/hibernate/Survey"
servicename="HibernateSurvey"
dialect="net.sf.hibernate.dialect.HSQLDialect"
datasource="java:/DefaultDS"
username="sa"
password=""/>
```
这里提供了一些与`<hibernatecfg>`相同的参数,如`dialect`、`username`和`password`,还提供了额外信息,包括用于创建`SessionFactory`的数据源名称和存储`SessionFactory`的JNDI名称。
生成的`\build\jboss-service.xml`文件内容如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>
<!-- Generated file - Do not edit! -->
<server>
<mbean code="net.sf.hibernate.jmx.HibernateService"
name="jboss.jca:service=HibernateSurvey">
<depends>jboss.jca:service=RARDeployer</depends>
<attribute name="MapResources">
example/survey/SurveyTaker.hbm.xml,
example/survey/Survey.hbm.xml,
example/survey/Answer.hbm.xml,
example/survey/Question.hbm.xml
</attribute>
<attribute name="JndiName">java:/hibernate/Survey</attribute>
<attribute name="Datasource">java:/DefaultDS</attribute>
<attribute
name="Dialect">net.sf.hibernate.dialect.HSQLDialect</attribute>
<attribute name="UserName">sa</attribute>
<attribute name="UseOuterJoin">false</attribute>
<attribute name="ShowSql">false</attribute>
</mbean>
</server>
```
该文件包含了JBoss管理Hibernate类所需的所有信息。从映射文件列表可以看出XDoclet代码生成的强大之处。在实际应用中,如果有大量类,手动维护这个列表会非常繁琐且容易出错。
#### 3. 使用映射属性标记源文件
不使用XDoclet时,需手动为`User`类创建普通映射文档,并且每次更改类时,都要记得同时更改映射文档。而使用XDoclet,可以将信息直接放在源代码中。
标记源文件涉及在类级别和方法级别设置属性。下面通过示例Survey应用的Java类,逐步介绍如何处理更复杂的关系。
##### 3.1 标记属性
以简单的`Question`类为例,它包含`id`和`question`两个属性。问题将存储在数据库的`Question`表中,`id`作为主键。让数据库提供主键,因此指定主键生成器为`native`,同时使用读写缓存来缓存`Question`对象。
```java
package example.survey;
/**
*
* @author Eric Pugh
*
* @hibernate.class
* table="QUESTIONS"
* @hibernate.cache
* usage="read-write"
*/
public class Question {
private Integer id;
private String question;
/**
* @hibernate.id generator-class="native" column="Q
```
0
0
复制全文
相关推荐








