Wednesday, September 22, 2010

This document has been copied from Joss documentation.
http://docs.jboss.org/tools/3.0.1.GA/en/hibernatetools/html_single/#map_file_wizard

Olga Chikvina

Svetlana Mukhina

Version: 3.2.4.GA
April 2008


1. Preface
1.1. Key Features
1.2. Other relevant resources on the topic

2. Download and install Hibernate Tools


2.1. JBoss Tools
2.2. Eclipse IDE
2.2.1. Usage of Eclipse WTP

2.3. Ant


3. Code generation architecture


3.1. Hibernate Meta Model
3.2. Exporters

4. Eclipse Plugins


4.1. Introduction
4.2. Creating a Hibernate Mapping File
4.3. Creating a Hibernate Configuration File
4.4. Creating a Hibernate Console Configuration
4.5. Reverse Engineering and Code Generation
4.5.1. Code Generation Launcher
4.5.2. Exporters

4.6. Hibernate Mapping and Configuration File Editor


4.6.1. Java property/class completion
4.6.2. Table/Column completion
4.6.3. Configuration property completion

4.7. Structured Hibernate Mapping and Configuration File Editor

4.8. Reveng.xml Editor

4.9. Hibernate Console Perspective


4.9.1. Viewing the entity structure
4.9.2. Prototyping Queries
4.9.3. Properties View

4.10. Enable debug logging in the plugins


4.10.1. Relevant Resources Links

4.11. Hibernate support for Dali plugins in Eclipse WTP


5. Ant Tools


5.1. Introduction
5.2. The <hibernatetool> Ant Task
5.2.1. Basic examples

5.3. Hibernate Configurations


5.3.1. Standard Hibernate Configuration (<configuration>)
5.3.2. Annotation based Configuration (<annotationconfiguration>)
5.3.3. JPA based configuration (<jpaconfiguration>)
5.3.4. JDBC Configuration for reverse engineering (<jdbcconfiguration>)

5.4. Exporters


5.4.1. Database schema exporter (<hbm2ddl>)
5.4.2. POJO java code exporter (<hbm2java>)
5.4.3. Hibernate Mapping files exporter (<hbm2hbmxml>)
5.4.4. Hibernate Configuration file exporter (<hbm2cfgxml>)
5.4.5. Documentation exporter (<hbm2doc>)
5.4.6. Query exporter (<query>)
5.4.7. Generic Hibernate metamodel exporter (<hbmtemplate>)

5.5. Using properties to configure Exporters


5.5.1. <property> and <propertyset>
5.5.2. Getting access to user specific classes

6. Controlling reverse engineering


6.1. Default reverse engineering strategy
6.2. hibernate.reveng.xml file
6.2.1. Schema Selection (<schema-selection>)
6.2.2. Type mappings (<type-mapping>)
6.2.3. Table filters (<table-filter>)
6.2.4. Specific table configuration (<table>)

6.3. Custom strategy

6.4. Custom Database Metadata


7. Controlling POJO code generation


7.1. The <meta> attribute
7.1.1. Recommendations
7.1.2. Advanced <meta> attribute examples
Hibernate Tools is a toolset for Hibernate 3 and related projects. The tools provide Ant tasks and Eclipse plugins for performing reverse engineering, code generation, visualization and interaction with Hibernate.
First, we propose to look through the list of key features that you can benefit from if you start using Hibernate Tools.
FeatureBenefitChapter
Code Generation through Ant Task
Allows to execute mapping or Java code generation from reverse engineering, schema generation and generation of other artifacts during the build process.
ant task
Wizards for creation purposes and code generation
A set of wizards are provided with the Hibernate Eclipse tools to quickly create common Hibernate files such as configuration (cfg.xml) files, mapping files and revenge.xml as well. Code Generation wizard helps to generate a series of various artifacts, there is even support for completely reverse engineer an existing database schema.
hibernate mapping file hibernate configuration file code generation
Mapping and Configuration files Editors
Support auto-completion and syntax highlighting. Editors also support semantic auto-completion for class names and property/field names, making it much more versatile than a normal XML editor.
mapping and configuration files editors
Tools for organizing and controlling Reverse Engineering
Code Generation wizard provides powerful functionality for generating a series of various artifacts like domain model classes, mapping files, annotated EJB3 entity beans, etc. and reveng.xml file editor allows to control this processes.
code generation reveng.xml editor
Hibernate Console
It is a new perspective in Eclipse which provides an overview of your Hibernate Console configurations, were you also can get an interactive view of your persistent classes and their relationships. The console allows you to execute HQL queries against your database and browse the result directly in Eclipse.
hibernate console
Functional Mapping Diagram
Makes possible to visualize structure of entities and relationships between them.
mapping diagram
Eclipse JDT integration
Hibernate Tools integrates into the Java code completion and build support of Java in Eclipse. This gives you code completion of HQL inside Java code. Additionally, Hibernate Tools will add problem markers if your queries are not valid against the console configuration associated with the project.
 

Hibernate Tools can be used "standalone" via Ant 1.6.x or fully integrated into an Eclipse + WTP based IDE, such as JBDS/JBoss Tools, or a default Eclipse + WTP installation. The following sections describe the install steps in these environments.

Note:

The Hibernate Tools 3.2.4.GA (the current release version) requires Eclipse Ganymede 3.4.2.
JBoss Tools 3.0.0.GA (the latest release) includes Hibernate Tools 3.2.4.GA and thus nothing is required besides downloading and installing JBoss Tools. If you need to update to a newer version of the Hibernate Tools just follow the instructions in the Eclipse IDE section.
To install the Hibernate Tools into any Eclipse 3.4.x based IDE you can either download the Hibernate Tools distribution from the JBoss Tools download page or from the JBoss Tools Update Site.
If you download the Hibernate Tools distribution you need to place the /plugins and /feature directory into your eclipse directory or eclipse extensions directory. Sometimes Eclipse does not automatically detect new plugins and thus the tools will not be activated. To ensure eclipse sees these changes just clean up the cached plugin information by running eclipse with the -clean option, e.g. eclipse -clean. Using the updatesite does not require any additional steps.

Note:

If you need more basic instructions on installing plugins and general usage of eclipse then check out https://eclipse-tutorial.dev.java.net/ and especially https://eclipse-tutorial.dev.java.net/visual-tutorials/updatemanager.html which covers using the update manager.
The code generation mechanism in the Hibernate Tools consists of a few core concepts. This section explains their overall structure which are the same for the Ant and Eclipse tools.
The meta model is the model used by Hibernate Core to perform its object relational mapping. The model includes information about tables, columns, classes, properties, components, values, collections etc. The API is in org.hibernate.mapping and its main entry point is the Configuration class, the same class that is used to build a session factory.
The model represented by the Configuration class can be build in many ways. The following list the currently supported ones in Hibernate Tools.


In most projects you will normally use only one of the Core, Annotation or JPA configuration and possibly the JDBC configuration if you are using the reverse engineering facilities of Hibernate Tools.
The following drawing illustrates the core concepts:



The code generation is done based on the Configuration model no matter which type of configuration have been used to create the meta model, and thus the code generation is independent on the source of the meta model and represented via Exporters.
This chapter will introduce you to the functionality that Hibernate Tools provide within Eclipse. That is a set of wizards and editors for simplifying the work with Hibernate.
Hibernate Eclipse Tools include wizards for creating Hibernate mapping files, configuration files (.cfg.xml), revenge.xml as well as wizards for adjusting Console Configuration and Code Generation. Special structured and XML editors, editors for executing HQL and Criteria queries are also provided in Hibernate Console. Refer to Key Features section to find all benefits that you can take advantage of while using the tools within Eclipse.

Note:

Please note that these tools do not try to hide any functionality of Hibernate. The tools make working with Hibernate easier, but you are still encouraged/required to read the Hibernate Documentation to fully utilize Hibernate Tools and especially Hibernate it self.
A Console configuration describes how the Hibernate plugin should configure Hibernate and what configuration files, including which classpath are needed to load the POJO's, JDBC drivers etc. It is required to make usage of query prototyping, reverse engineering and code generation. You can have multiple named console configurations. Normally you would just need one per project, but more is definitely possible if your project requires this.
You create a console configuration by running the Console Configuration Wizard, shown in the following screenshot. The same wizard will also be used if you are coming from the hibernate.cfg.xml wizard and had enabled Create Console Configuration .
The dialog consists of five tabs:

The following table describes the available settings on the Main tab. The wizard can automatically detect default values for most of these if you started the wizard with the relevant java project or resource selected.
Parameter
Description
Auto detected value
Name
The unique name of the console configuration
Name of the selected project
Type
Choose between "Core", "Annotations" and "JPA". Note that the two latter requires running Eclipse IDE with a JDK 5 runtime, otherwise you will get classloading and/or version errors.
No default value
Project
The name of a java project which classpath should be used in the console configuration
Name of the selected project
Database connection
DTP provided connection that you can use instead of what is in cfg.xml and jpa persistence.xml. It's possible to use either already configured hibernate or JPA connection or specify a new one here.
[Hibernate Configured connection]
Property file
Path to a hibernate.properties file
First hibernate.properties file found in the selected project
Configuration file
Path to a hibernate.cfg.xml file
First hibernate.cfg.xml file found in the selected project
Persistence unit
Name of the persistence unit to use
No default value (lets Hibernate Entity Manager find the persistence unit)


The next table describes Hibernate Console Configuration options available on the Options tab.
Parameter
Description
Auto detected value
Naming strategy
Fully qualified classname of a custom NamingStrategy. Only required if you use a special naming strategy.
No default value
Entity resolver
Fully qualified classname of a custom EntityResolver. Only required if you have special xml entity includes in your mapping files.
No default value


The following table specifies the parameters of the Classpath tab of the wizard.
Parameter
Description
Auto detected value
Classpath
The classpath for loading POJO and JDBC drivers; only needed if the default classpath of the Project does not contain the required classes. Do not add Hibernate core libraries or dependencies, they are already included. If you get ClassNotFound errors then check this list for possible missing or redundant directories/jars.
Empty
Include default classpath from project
When enabled the project classpath will be appended to the classpath specified above
Enabled


Parameters of the Mappings tab of the Hibernate Console Configuration wizard are explained below:
Parameter
Description
Auto detected value
Mapping files
List of additional mapping files that should be loaded. Note: A hibernate.cfg.xml or persistence.xml can also contain mappings. Thus if these are duplicated here, you will get "Duplicate mapping" errors when using the console configuration.
empty


It allows to define general aspects of the launch configuration including storage location, console encoding and some others.
Clicking Finish creates the configuration and shows it in the Hibernate Configurations view.

A "click-and-generate" reverse engineering and code generation facility is available. This facility allows you to generate a range of artifacts based on database or an already existing Hibernate configuration, be that mapping files or annotated classes. Some of these are POJO Java source file, Hibernate .hbm.xml , hibernate.cfg.xml generation and schema documentation.
To start working with this process, start the Hibernate Code Generation which is available in the toolbar via the Hibernate icon or via the Run > Hibernate Code Generation menu item.
When you click on Open Hibernate Code Generation Dialog... the standard Eclipse launcher dialog will appear. In this dialog you can create, edit and delete named Hibernate code generation "launchers".


The first time you create a code generation launcher you should give it a meaningful name, otherwise the default prefix New_Generation will be used.
The dialog also have the standard tabs Refresh and Common that can be used to configure which directories should be automatically refreshed and various general settings launchers, such as saving them in a project for sharing the launcher within a team.
On the Main tab you see the following fields:
Field
Description
Console Configuration
The name of the console configuration which should be used when code generating
Output directory
Path to a directory where all output will be written by default. Be aware that existing files will be overwritten, so be sure to specify the correct directory.
Reverse engineer from JDBC Connection
If enabled, the tools will reverse engineer the database available via the connection information in the selected Hibernate Console Configuration and generate code based on the database schema. If not enabled, the code generation will just be based on the mappings already specified in the Hibernate Console configuration.
Package
The package name here is used as the default package name for any entities found when reverse engineering
reveng.xml
Path to a reveng.xml file. A reveng.xml file allows you to control certain aspects of the reverse engineering. e.g. how jdbc types are mapped to hibernate types and especially important which tables are included/excluded from the process. Clicking "setup" allows you to select an existing reveng.xml file or create a new one. See more details about the reveng.xml file in Chapter 6, Controlling reverse engineering.
reveng. strategy
If reveng.xml does not provide enough customization you can provide your own implementation of an ReverseEngineeringStrategy. The class needs to be in the classpath of the Console Configuration, otherwise you will get class not found exceptions. See Section 6.3, “Custom strategy” for details and an example of a custom strategy.
Generate basic typed composite ids
A table that has a multi-column primary key a <composite-id> mapping will always be created. If this option is enabled and there are matching foreign-keys each key column is still considered a 'basic' scalar (string, long, etc.) instead of a reference to an entity. If you disable this option a <key-many-to-one> instead. Note: a <many-to-one> property is still created, but is simply marked as non-updatable and non-insertable.
Detect optimistic lock columns
Automatically detect optimistic lock columns. Controllable via reveng. strategy; the current default is to use columns named VERSION or TIMESTAMP.
Detect many-to-many tables
Automatically detect many-to-many tables. Controllable via reveng. strategy.
Detect one-to-one associations
Reverse engineering detects one-to-one associations via primary key and both hbm.xml and annotation generation generates the proper code for it.
The detection is enabled by default (except for Seam 1.2 and Seam 2.0) reverse engineering. For Hibernate Tools generation there is a checkbox to disable if not wanted.
Use custom templates
If enabled, the Template directory will be searched first when looking up the templates, allowing you to redefine how the individual templates process the hibernate mapping model.
Template directory
A path to a directory with custom templates

The Exporters tab is used to specify which type of code that should be generated. Each selection represents an Exporter that is responsible for generating the code, hence the name.

The following table describes in short the various exporters. Remember you can add/remove any Exporters depending on your needs.
Field
Description
Domain code
Generates POJO's for all the persistent classes and components found in the given Hibernate configuration.
DAO code
Generates a set of DAO's for each entity found.
Hibernate XML Mappings
Generate mapping (hbm.xml) files for each entity.
Hibernate XML Configuration
Generate a hibernate.cfg.xml file. Used to keep the hibernate.cfg.xml update with any new found mapping files.
Schema Documentation (.html)
Generates a set of html pages that documents the database schema and some of the mappings.
Generic Exporter (hbmtemplate)
Fully customizable exporter which can be used to perform custom generation.
Schema Export (.ddl)
Generates the appropriate SQL DDL and allows you to store the result in a file or export it directly to the database.

Each Exporter listens to certain properties and these can be setup in the Properties section where you can add/remove predefined or customer properties for each of the exporters. The following table lists the time of writing predefined properties:

Name
Description
jdk5
Generate Java 5 syntax
ejb3
Generate EJB 3 annotations
for_each
Specifies for which type of model elements the exporter should create a file and run through the templates. Possible values are: entity, component, configuration
template_path
Custom template directory for this specific exporter. You can use Eclipse variables.
template_name
Name for template relative to the template path
outputdir
Custom output directory for this specific exporter. You can use Eclipse variables.
file_pattern
Pattern to use for the generated files, relatively for the output dir. Example: {package-name}/{class-name}.java .
dot.executable
Executable to run GraphViz (only relevant, but optional for Schema documentation)
drop
Output will contain drop statements for the tables, indices and constraints
delimiter
If specified the statements will be dumped to this file
create
Output will contain create statements for the tables, indices and constraints
scriptToConsole
The script will be output to Console
exportToDatabase
Executes the generated statements against the database
outputFileName
If specified the statements will be dumped to this file
haltOnError
Halts the build process if an error occurs
format
Applies basic formatting to the statements
schemaUpdate
Updates a schema


To add a property to the chosen Exporter click the Add button in the Properties section. In the appeared dialog you should select the property from the proposed list and the value for it.


The Hibernate Mapping File editor provides XML editing functionality for the hbm.xml and cfg.xml files. The editor is based on the Eclipse WTP tools and extends its functionality to provide Hibernate specific code completion.

A reveng.xml file is used to customize and control how reverse engineering is performed by the tools. The plugins provide an editor to ease the editing of this file and hence used to configure the reverse engineering process.
The editor is intended to allow easy definition of type mappings, table include/excludes and specific override settings for columns, e.g. define an explicit name for a column when the default naming rules are not applicable.
The editor is activated as soon as an .reveng.xml file is opened. To get an initial reveng.xml file the Reverse Engineering File Wizard can be started via Ctrl+N and Hibernate > Hibernate Reverse Engineering File (reveng.xml) then.

Or you can get it via the Code Generation Launcher by checking the proper section in the Main tab of the Hibernate Code Generation Wizard.
The following screenshot shows the Overview page where the wanted console configuration is selected (auto-detected if Hibernate 3 support is enabled for the project)

The Table Filter page allows you to specify which tables to include and exclude. Pressing Refresh shows the tables from the database that have not yet been excluded.

The Type Mappings page is used for specifying type mappings from JBDC types to any Hibernate type (including usertypes) if the default rules are not applicable. Here again to see the database tables press Refresh button underneath. More about type mappings you can find further in the Type Mappings section.

The Table and Columns page allows you to explicit set e.g. which hibernatetype and propertyname that should be used in the reverse engineered model. For more details on how to configure the tables while reverse engineering read the Specific table configuration section.

Now that you have configured all necessary parts, you can learn how to work with Hibernate Console Perspective.
The Hibernate Console Perspective combines a set of views which allow you to see the structure of your mapped entities/classes, edit HQL queries, execute the queries, and see the results. To use this perspective you need to create a Console configuration.
To view your new configuration and entity/class structure, switch to Hibernate Configurations View. Expanding the tree allows you to browse the class/entity structure and see the relationships.

The Console Configuration does not dynamically adjust to changes done in mappings and java code. To reload the configuration select the configuration and click the Reload button in the view toolbar or in the context menu.
Besides, it's possible to open source and mapping files for objects showed in Hibernate Configurations View. Just bring up the context menu for a necessary object and select Open Source File to see appropriate Java class or Open Mapping File to open a proper .hbm.xml.

Queries can be prototyped by entering them in the HQL or Criteria Editor. The query editors are opened by right-clicking the Console Configuration and selecting either HQL Editor or Hibernate Criteria Editor. The editors automatically detect the chosen configuration.
If the menu item is disabled then you need at first to create a Session Factory. That is done by simply expanding the Session Factory node.
By brining up the context menu for a chosen entity or property in the Console Configuration and opening HQL Editor or Hibernate Criteria Editor you'll get a prefill query.

To copy a portion of code from .java file into a HQL or Criteria editor, make use of the Quick Fix option (Ctrl + 1).

You can also update the original java code according to changes in the HQL or Criteria editor. For that you should save your HQL/Criteria query and submit the replacing in appeared confirmation dialog.

Executing the query is done by clicking the green run button in the toolbar or pressing Ctrl+Enter .
Errors during creation of the Session Factory or running the queries (e.g. if your configuration or query is incorrect) will be shown in a message dialog or inclined in the view that detected the error, you may get more information about the error in the Error Log View on the right pane.
Results of a query will be shown in the Hibernate Query Result View and details of possible errors (syntax errors, database errors, etc.) can be seen in the Error Log View.
Starting from 3.0.0 Alpha1 version of JBoss Tools Hibernate plugins support Eclipse Dali integration what now makes it possible to use a Hibernate as a complete JPA development platform.
When starting a new JPA project from New > Other > JPA > JPA Project (or simply New > JPA Project in JPA Perspective), the first wizard page looks as follows.

It's possible here to select a target runtime and change the project configuration, or you can leave everything as it is.
On the JPA Facet page you should choose Hibernate as a target platform. Also select the proper database connection, if it is defined, or add a new one by clicking the Add connection link.
Hitting Finish will generate the project.

By enabling Hibernate platform specific features you can now generate DDL and Entities. For that find JPA Tools > Generate DDL/Generate Entities options in the context menu of your JPA project.

The Generate DDL/Entities wizards first will ask you to choose the directory where all output will be written.

To generate entities you can use:
Thus, you can now have the Hibernate runtime support in Eclipse JPA projects.
Maybe somebody will find it more preferable to use Ant for generation purposes. Thus, this chapter is intended to get you ready to start using Hibernate Tools via Ant tasks.
To use the ant tasks you need to have the hibernatetool task defined. That is done in your build.xml by inserting the following xml (assuming the jars are in the lib directory):
<path id="toolslib">

 <path location="lib/hibernate-tools.jar" />

 <path location="lib/hibernate3.jar" />

 <path location="lib/freemarker.jar" />

 <path location="${jdbc.driver.jar}" />

</path>

   

<taskdef name="hibernatetool" 

         classname="org.hibernate.tool.ant.HibernateToolTask" 

         classpathref="toolslib" />

This <taskdef> defines an Ant task called hibernatetool which now can be used anywhere in your ant build.xml files. It is important to include all the Hibernate Tools dependencies as well as the jdbc driver.
Notice that to use the annotation based Configuration you must get a release.
When using the hibernatetool task you have to specify one or more of the following:
<hibernatetool

  destdir="defaultDestinationDirectory"

  templatepath="defaultTemplatePath"

>

  <classpath ...>

  <property key="propertyName" value="value"/>

  <propertyset ...>

  (<configuration ...>|<annotationconfiguration ...>|

   <jpaconfiguration ...>|<jdbcconfiguration ...>)

  (<hbm2java>,<hbm2cfgxml>,<hbmtemplate>,...)  

</hibernatetool>

Attribute nameDefinitionAttribute use
destdir
Destination directory for files generated with exporters
Required
templatepath
A path to be used to look up user-edited templates
Optional
classpath
A classpath to be used to resolve resources, such as mappings and usertypes
Optional, but very often required
property (and propertyset)
Used to set properties to control the exporters. Mostly relevant for providing custom properties to user defined templates
Optional
configuration (annotationconfiguration, jpaconfiguration, jdbcconfiguration)
One of four different ways of configuring the Hibernate Meta Model must be specified

hbm2java (hbm2cfgxml, hbmtemplate, etc.)
One or more of the exporters must be specified


Hibernatetool supports four different Hibernate configurations: A standard Hibernate configuration (<configuration>), Annotation based configuration (<annotationconfiguration>), JPA persistence based configuration (<jpaconfiguration>) and a JDBC based configuration (<jdbcconfiguration>) for use when reverse engineering.
Each have in common that they are able to build up a Hibernate Configuration object from which a set of exporters can be run to generate various output.
The following sections describe what the various configurations can do, plus lists the individual settings they have.
A <configuration> is used to define a standard Hibernate configuration. A standard Hibernate configuration reads the mappings from a cfg.xml and/or a fileset.
<configuration

  configurationfile="hibernate.cfg.xml"

  propertyfile="hibernate.properties"

  entityresolver="EntityResolver classname"

  namingstrategy="NamingStrategy classname"

>

  <fileset...>

  

  </configuration>

Attribute nameDefinitionAttribute use
configurationfile
The name of a Hibernate configuration file, e.g. "hibernate.cfg.xml"
Optional
propertyfile
The name of a property file, e.g. "hibernate.properties"
Optional
entity-resolver
Name of a class that implements org.xml.sax.EntityResolver. Used if the mapping files require custom entity resolver
Optional
namingstrategy
Name of a class that implements org.hibernate.cfg.NamingStrategy. Used for setting up the naming strategy in Hibernate which controls the automatic naming of tables and columns.
Optional
fileset
A standard Ant fileset. Used to include hibernate mapping files. Remember that if mappings are already specified in the hibernate.cfg.xml then it should not be included via the fileset as it will result in duplicate import exceptions.


A <jpaconfiguration> is used when you want to read the metamodel from JPA/Hibernate Annotation where you want to use the auto-scan configuration as defined in the JPA spec (part of EJB3). In other words, when you do not have a hibernate.cfg.xml, but instead have a setup where you use a persistence.xml packaged in a JPA compliant manner.
The <jpaconfiguration> will simply just try and auto-configure it self based on the available classpath, e.g. look for META-INF/persistence.xml.
The persistenceunit attribute can be used to select a specific persistence unit. If no persistenceunit is specified it will automatically search for one and if a unique one is found, use it, but if multiple persistence units are available it will error.
To use a <jpaconfiguration> you will need to specify some additional jars from Hibernate EntityManager in the <taskdef> of the hibernatetool. The following shows a full setup:
<path id="ejb3toolslib">

 <path refid="jpatoolslib"/> <!-- ref to previously defined toolslib -->

 <path location="lib/hibernate-annotations.jar" />

 <path location="lib/ejb3-persistence.jar" />

 <path location="lib/hibernate-entitymanager.jar" />

 <path location="lib/jboss-archive-browsing.jar" />

 <path location="lib/javaassist.jar" /> 

</path>

   

<taskdef name="hibernatetool" 

         classname="org.hibernate.tool.ant.HibernateToolTask" 

         classpathref="jpatoolslib" />



<hibernatetool destdir="${build.dir}">

 <jpaconfiguration persistenceunit="caveatemptor"/>

 <classpath>

  <!-- it is in this classpath you put your classes dir,

   and/or jpa persistence compliant jar -->

  <path location="${build.dir}/jpa/classes" />

 </classpath>



 <!-- list exporters here -->



</hibernatetool>

A <jdbcconfiguration> is used to perform reverse engineering of the database from a JDBC connection.
This configuration works by reading the connection properties either from hibernate.cfg.xml or hibernate.properties with a fileset.
The <jdbcconfiguration> has the same attributes as a <configuration> plus the following additional attributes:
<jdbcconfiguration

  ...

  packagename="package.name"

  revengfile="hibernate.reveng.xml"

  reversestrategy="ReverseEngineeringStrategy classname"

  detectmanytomany="true|false"

  detectoptmisticlock="true|false"

>

  ...

  </jdbcconfiguration>

Attribute nameDefinitionAttribute use
packagename
The default package name to use when mappings for classes are created
Optional
revengfile
The name of a property file, e.g. "hibernate.properties"
Optional
reversestrategy
Name of a class that implements org.hibernate.cfg.reveng.ReverseEngineeringStrategy. Used for setting up the strategy the tools will use to control the reverse engineering, e.g. naming of properties, which tables to include/exclude etc. Using a class instead of (or as addition to) a reveng.xml file gives you full programmatic control of the reverse engineering.
Optional
detectManytoMany
If true, tables which are pure many-to-many link tables will be mapped as such. A pure many-to-many table is one which primary-key contains exactly two foreign-keys pointing to other entity tables and has no other columns.
Default: true
detectOptimisticLock
If true, columns named VERSION or TIMESTAMP with appropriate types will be mapped with the appropriate optimistic locking corresponding to <version> or <timestamp>.
Default: true

Exporters are the parts that do the actual job of converting the hibernate metamodel into various artifacts, mainly code. The following section describes the current supported set of exporters in the Hibernate Tool distribution. It is also possible for userdefined exporters, that is done through the <hbmtemplate> exporter.
<hbm2ddl> lets you run schemaexport and schemaupdate which generates the appropriate SQL DDL and allow you to store the result in a file or export it directly to the database. Remember that if a custom naming strategy is needed it is placed on the configuration element.
<hbm2ddl

 export="true|false"

 update="true|false"

 drop="true|false"

 create="true|false"

 outputfilename="filename.ddl"

 delimiter=";" 

 format="true|false"

 haltonerror="true|false"

 >

Attribute nameDefinitionAttribute use
export
Executes the generated statements against the database
Default: true
update
Try and create an update script representing the "delta" between what is in the database and what the mappings specify. Ignores create/update attributes. (Do *not* use against production databases, no guarantees at all that the proper delta can be generated nor that the underlying database can actually execute the needed operations).
Default: false
drop
Output will contain drop statements for the tables, indices and constraints
Default: false
create
Output will contain create statements for the tables, indices and constraints
Default: true
outputfilename
If specified the statements will be dumped to this file
Optional
delimiter
If specified the statements will be dumped to this file
Default: ";"
format
Apply basic formatting to the statements
Default: false
haltonerror
Halt build process if an error occurs
Default: false

Exporters can be controlled by user properties. The user properties are specified via <property> or <propertyset> and each exporter will have access to them directly in the templates and via Exporter.setProperties().
When using the <jdbcconfiguration>, the ant task will read the database metadata and thus will perform a reverse engineering of the database schema into a normal Hibernate Configuration. It is from this object e.g. <hbm2java> can generate other artifacts such as .java , .hbm.xml etc.
To govern this process Hibernate uses a reverse engineering strategy. A reverse engineering strategy is mainly called to provide more java like names for tables, column and foreignkeys into classes, properties and associations. It also used to provide mappings from SQL types to Hibernate types. The strategy can be customized by a user. The user can even provide its own custom reverse engineering strategy if the provided strategy is not enough, or simply just provide a small part of the strategy and delegate the rest to the default strategy.
Thus, further in this chapter we will discuss how you can configure the process of a reverse engineering, what default reverse engineering strategy includes as well as some custom concepts.
To have fine control over the process a hibernate.reveng.xml file can be provided. In this file you can specify type mappings and table filtering. This file can be created by hand (it's just basic XML) or you can use the Hibernate plugins which have a specialized editor.

Note:

Many databases are case-sensitive with their names and thus if you cannot make some table match and you are sure it is not excluded by a <table-filter> then check if the case matches; most databases stores table names in uppercase.
Below you can see an example of a reveng.xml. Following the example gives you more details about the format.
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-reverse-engineering 

  SYSTEM "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >



<hibernate-reverse-engineering>



<type-mapping>

 <!-- jdbc-type is name for java.sql.Types -->

 <sql-type jdbc-type="VARCHAR" length='20' hibernate-type="SomeUserType" /> 

 <sql-type jdbc-type="VARCHAR" length='1' hibernate-type="yes_no" />

 <!-- length, scale and precision can be used to specify the mapping precisely -->

 <sql-type jdbc-type="NUMERIC"  precision='1' hibernate-type="boolean" /> 

 <!-- the type-mappings are ordered. This mapping will be consulted last, 

  thus overridden by the previous one if precision=1 for the column -->

 <sql-type jdbc-type="NUMERIC"  hibernate-type="long" /> 

</type-mapping>



<!-- BIN$ is recycle bin tables in Oracle -->

<table-filter match-name="BIN$.*" exclude="true" /> 



<!-- Exclude DoNotWantIt from all catalogs/schemas -->

<table-filter match-name="DoNotWantIt" exclude="true" /> 



<!-- exclude all tables from the schema SCHEMA in catalog BAD. -->

<table-filter match-catalog="BAD" match-schema="SCHEMA" match-name=".*" exclude="true" /> 



<!-- table allows you to override/define how reverse engineering 

     is done for a specific table -->

<table name="ORDERS"> 

 <primary-key>

   <!-- setting up a specific id generator for a table -->

  <generator class="sequence">

    <param name="table">seq_table</param>

  </generator>

   <key-column name="CUSTID"/>

 </primary-key>

 <column name="NAME" property="orderName" type="string" />

 <!-- control many-to-one and set names for a specific named foreign key constraint -->

 <foreign-key constraint-name="ORDER_CUST">

   <many-to-one property="customer"/>

   <set property="orders"/>

 </foreign-key>

 <!-- can also control a pure (shared pk) one-to-one  -->

  <foreign-key constraint-name="ADDRESS_PERSON">

   <one-to-one exclude="false"/>

   <inverse-one-to-one exclude="true"/>

  </foreign-key>

</table>



</hibernate-reverse-engineering>

The <type-mapping> section specifies how the JDBC types found in the database should be mapped to Hibernate types. e.g. java.sql.Types.VARCHAR with a length of 1 should be mapped to the Hibernate type yes_no or java.sql.Types.NUMERIC should generally just be converted to the Hibernate type long.
<type-mapping>

 <sql-type

  jdbc-type="integer value or name from java.sql.Types"

  length="a numeric value"

  precision="a numeric value"

  scale="a numeric value"

  not-null="true|false"  

  hibernate-type="hibernate type name"  

 />

</type-mapping>

The number of attributes specified and the sequence of the sql-type's is important. Meaning that Hibernate will search for the most specific first, and if no specific match is found it will seek from top to bottom when trying to resolve a type mapping.
The following is an example of a type-mapping which shows the flexibility and the importance of ordering of the type mappings.
<type-mapping>

 <sql-type jdbc-type="NUMERIC" precision="15" hibernate-type="big_decimal"/>

 <sql-type jdbc-type="NUMERIC" not-null="true" hibernate-type="long" />

 <sql-type jdbc-type="NUMERIC" not-null="false" hibernate-type="java.lang.Long" />

 <sql-type jdbc-type="VARCHAR" length="1" not-null="true" 

       hibernate-type="java.lang.Character"/>

 <sql-type jdbc-type="VARCHAR" hibernate-type="your.package.TrimStringUserType"/>

 <sql-type jdbc-type="VARCHAR" length="1" hibernate-type="char"/>

 <sql-type jdbc-type="VARCHAR" hibernate-type="string"/>

</type-mapping>

The following table shows how this affects an example table named CUSTOMER:
Columnjdbc-typelengthprecisionnot-nullResulting hibernate-typeRationale
IDINTEGER 10trueintNothing is defined for INTEGER. Falling back to default behavior.
NAMEVARCHAR30 falseyour.package.TrimStringUserTypeNo type-mapping matches length=30 and not-null=false, but type-mapping matches the 2 mappings which only specifies VARCHAR. The type-mapping that comes first is chosen.
INITIALVARCHAR1 falsecharEven though there is a generic match for VARCHAR, the more specific type-mapping for VARCHAR with not-null="false" is chosen. The first VARCHAR sql-type matches in length but has no value for not-null and thus is not considered.
CODEVARCHAR1 truejava.lang.CharacterThe most specific VARCHAR with not-null="true" is selected
SALARYNUMERIC 15falsebig_decimalThere is a precise match for NUMERIC with precision 15
AGENUMERIC 3falsejava.lang.Longtype-mapping for NUMERIC with not-null="false"

The <table-filter> let you specify matching rules for performing general filtering/setup for tables, e.g. let you include or exclude specific tables based on the schema or even a specific prefix.
<table-filter

 match-catalog="catalog_matching_rule"

 match-schema="schema_matching_rule"

 match-name="table_matching_rule"

 exclude="true|false"

 package="package.name"

/>

Attribute nameDefinitionDefault value
match-catalogPattern for matching catalog part of the table.*
match-schemaPattern for matching schema part of the table.*
match-tablePattern for matching table part of the table.*
exclude If true the table will not be part of the reverse engineeringfalse
packageThe default package name to use for classes based on tables matched by this table-filter""

<table> allows you to provide explicit configuration on how a table should be reverse engineered. Amongst other things it allows controlling over the naming of a class for the table, specifying which identifier generator should be used for the primary key etc.
<table 

 catalog="catalog_name"

 schema="schema_name"

 name="table_name"

 class="ClassName"

>

 <primary-key.../>

 <column.../>

 <foreign-key.../>

 </table>

Attribute nameDefinitionAttribute use
catalogCatalog name for a table. It has to be specified if you are reverse engineering multiple catalogs or if it is not equal to hiberante.default_catalog.Optional
schemaSchema name for a table. It has to be specified if you are reverse engineering multiple schemas or if it is not equal to hiberante.default_schema.Optional
nameName for a table.Required
classThe class name for a table. Default name is a camelcase version of the table name.Optional

A <primary-key> allows you to define a primary-key for tables that don't have it defined in the database, and probably more importantly it allows you to define which identifier strategy should be used (even for already existing primary-key's).
<primary-key

 <generator class="generatorname">

   <param name="param_name">parameter value</param>

 </generator>

 <key-column...>

 </primary-key>

Attribute nameDefinitionAttribute use
generator/classDefines which identifier generator should be used. The class name is any hibernate short hand name or fully qualified class name for an identifier strategy.Optional
generator/paramAllows to specify which parameter with a name and value should be passed to the identifier generator.Optional
key-columnSpecifies which column(s ) the primary-key consists of. A key-column is same as column, but does not have the exclude property.Optional

With a <column> it is possible to explicitly name the resulting property for a column. It is also possible to redefine what jdbc and/or Hibernate type a column should be processed as and finally it is possible to completely exclude a column from processing.
<column

 name="column_name"

 jdbc-type="java.sql.Types type"

 type="hibernate_type"

 property="propertyName"

 exclude="true|false"

/>

Attribute nameDefinitionAttribute use
nameColumn nameRequired
jdbc-typeWhich jdbc-type this column should be processed as. A value from java.sql.Types, either numerical (93) or the constant name (TIMESTAMP).Optional
typeWhich hibernate-type to use for this specific columnOptional
propertyWhat property name will be generated for this columnOptional
excludeSet to true if this column should be ignoreddefault: false

The <foreign-key> has two purposes. One for allowing to define foreign-keys in databases that does not support them or does not have them defined in their schema. Secondly, to allow defining the name of the resulting properties (many-to-one, one-to-one and one-to-many's).
<foreign-key

  constraint-name="foreignKeyName"

  foreign-catalog="catalogName"

  foreign-schema="schemaName"

  foreign-table="tableName"

 >

 <column-ref local-column="columnName" foreign-column="foreignColumnName"/>

 <many-to-one 

   property="aPropertyName"

   exclude="true|false"/>

 <set 

   property="aCollectionName"

   exclude="true|false"

   

 <one-to-one 

   property="aPropertyName"

   exclude="true|false"/>

 <inverse-one-to-one

   property="aPropertyName"

   exclude="true|false"/>

   </foreign-key>

Attribute nameDefinitionAttribute use
constraint-nameName of the foreign key constraint. Important when naming many-to-one, one-to-one and set. It is the constraint-name that is used to link the processed foreign-keys with the resulting property names.Required
foreign-catalogName of the foreign table's catalog. (Only relevant if you want to explicitly define a foreign key).Optional
foreign-schemaName of the foreign table's schema. (Only relevant if you want to explicitly define a foreign key).Optional
foreign-tableName of the foreign table. (Only relevant if you want to explicitly define a foreign key).Optional
column-ref Defines that the foreign-key constraint between a local-column and foreign-column name. (Only relevant if you want to explicitly define a foreign key).Optional
many-to-oneDefines that a many-to-one should be created and the property attribute specifies the name of the resulting property. Exclude can be used to explicitly define that it should be created or not.Optional
setDefines that a set should be created based on this foreign-key and the property attribute specifies the name of the resulting (set) property. Exclude can be used to explicitly define that it should be created or not.Optional
one-to-oneDefines that a one-to-one should be created and the property attribute specifies the name of the resulting property. Exclude can be used to explicitly define that it should be created or not.Optional
inverse-one-to-oneDefines that an inverse one-to-one should be created based on this foreign-key and the property attribute specifies the name of the resulting property. Exclude can be used to explicitly define that it should be created or not.Optional

When using <hbm2java> or the eclipse plugin to generate POJO java code you have the possibility to control certain aspects of the code generation. This is primarily done with the <meta> tag in the mapping files. The following section describes the possible <meta> tags and their use.
The <meta> tag is a simple way of annotating the hbm.xml with information, so tools have a natural place to store/read information that is not directly related to the Hibernate core.
You can use the <meta> tag to e.g. tell <hbm2java> to only generate "protected" setters, have classes always implement a certain set of interfaces or even have them extend a certain base class and even more.
The following example shows how to use various <meta> attributes and the resulting java code.
<class name="Person">

    <meta attribute="class-description">

        Javadoc for the Person class

        @author Frodo

    </meta>

    <meta attribute="implements">IAuditable</meta>

    <id name="id" type="long">

        <meta attribute="scope-set">protected</meta>

        <generator class="increment"/>

    </id>

    <property name="name" type="string">

        <meta attribute="field-description">The name of the person</meta>

    </property>

</class>

The above hbm.xml will produce something like the following (code shortened for better understanding). Notice the Javadoc comment and the protected set methods:
// default package


import java.io.Serializable;

import org.apache.commons.lang.builder.EqualsBuilder;

import org.apache.commons.lang.builder.HashCodeBuilder;

import org.apache.commons.lang.builder.ToStringBuilder;


/** 

 *         Javadoc for the Person class

 *         @author Frodo

 */

public class Person implements Serializable, IAuditable {


    public Long id;


    public String name;


    public Person(java.lang.String name) {

        this.name = name;

    }


    public Person() {

    }


    public java.lang.Long getId() {

        return this.id;

    }


    protected void setId(java.lang.Long id) {

        this.id = id;

    }


    /** 

     * The name of the person

     */

    public java.lang.String getName() {

        return this.name;

    }


    public void setName(java.lang.String name) {

        this.name = name;

    }


}
AttributeDescription
class-description inserted into the javadoc for classes
field-description inserted into the javadoc for fields/properties
interface If true, an interface is generated instead of an class.
implements interface the class should implement
extends class that the current class should extend (ignored for subclasses)
generated-class overrule the name of the actual class generated
scope-class scope for class
scope-set scope for setter method
scope-get scope for getter method
scope-field scope for actual field
default-value default initialization value for a field
use-in-tostring include this property in the toString()
use-in-equals include this property in the equals() and hashCode() method. If no use-in-equals is specified, no equals/hashcode will be generated.
gen-property property will not be generated if false (use with care)
property-type Overrides the default type of property. Use this with any tag's to specify the concrete type instead of just Object.
class-code Extra code that will inserted at the end of the class
extra-import Extra import that will inserted at the end of all other imports

Attributes declared via the <meta> tag are per default "inherited" inside an hbm.xml file.
What does that mean? It means that if you e.g want to have all your classes implement IAuditable then you just add an <meta attribute="implements">IAuditable</meta> in the top of the hbm.xml file, just after <hibernate-mapping>. Now all classes defined in that hbm.xml file will implement IAuditable!
To avoid having a <meta> tag inherited then you can simply specify inherit = "false" for the attribute, e.g. <meta attribute = "scope-class" inherit = "false">public abstract</meta> will restrict the "class-scope" to the current class, not the subclasses.
The following are some good practices when using <meta> attributes.
If we have two entities with a bi-directional association between them and define at class scope level the meta attributes: use-in-string, use-in-equals:
<hibernate-mapping>

  <class name="Person">

    <meta attribute="use-in-tostring">true</meta>

    <meta attribute="use-in-equals">true</meta>

    ...

  </class>

</hibernate-mapping>

And for Event.hbm file:
<hibernate-mapping>              

  <class name="events.Event" table="EVENTS">

    <meta attribute="use-in-tostring">true</meta>

    <meta attribute="use-in-equals">true</meta>                  

    <id name="id" column="EVENT_ID">

        <generator class="native"/>

    </id>

    <property name="date" type="timestamp" column="EVENT_DATE"/>

    <property name="title"/>

    <set name="participants" table="PERSON_EVENT" inverse="true">

        <key column="EVENT_ID"/>

        <many-to-many column="PERSON_ID" class="events.Person"/>

    </set>                    

  </class>

</hibernate-mapping>

Then <hbm2java> will assume you want to include all properties and collections in the toString()/equals() methods and this can result in infinite recursive calls.
To remedy this you have to decide which side of the association will include the other part (if at all) in the toString()/equals() methods. Therefore it is not a good practice to put at class scope such meta attributes, unless you are defining a class without bi-directional associations.
We recommend instead to add the meta attributes at the property level:
<hibernate-mapping>             

  <class name="events.Event" table="EVENTS">                  

    <id name="id" column="EVENT_ID">

        <meta attribute="use-in-tostring">true</meta>

        <generator class="native"/>

    </id>

    <property name="date" type="timestamp" column="EVENT_DATE"/>

    <property name="title">

      <meta attribute="use-in-tostring">true</meta>

      <meta attribute="use-in-equals">true</meta>      

    </property>

    <set name="participants" table="PERSON_EVENT" inverse="true">

        <key column="EVENT_ID"/>

        <many-to-many column="PERSON_ID" class="events.Person"/>

    </set>                    

  </class>

</hibernate-mapping>

and now for Person:
<hibernate-mapping>

    <class name="Person">

    <meta attribute="class-description">

        Javadoc for the Person class

        @author Frodo

    </meta>

    <meta attribute="implements">IAuditable</meta>

    <id name="id" type="long">

        <meta attribute="scope-set">protected</meta>

        <meta attribute="use-in-tostring">true</meta>        

        <generator class="increment"/>

    </id>

    <property name="name" type="string">

        <meta attribute="field-description">The name of the person</meta>

        <meta attribute="use-in-tostring">true</meta>

    </property>

  </class>

</hibernate-mapping>

This section shows an example for using meta attributes (including userspecific attributes) together with the code generation features in Hibernate Tools.
The usecase being implemented is to automatically insert some pre- and post-conditions into the getter and setters of the generated POJO.
With a <meta attribute="class-code">, you can add additional methods on a given class, nevertheless such <meta> attribute can not be used at a property scope level and Hibernate Tools does not provide such <meta> attributes.
A possible solution for this is to modify the freemarker templates responsible for generating the POJO's. If you look inside hibernate-tools.jar, you can find the template: pojo/PojoPropertyAccessor.ftl
This file is as the name indicates used to generate property accessors for pojo's.
Extract the PojoPropertyAccessor.ftl into a local folder i.e. ${hbm.template.path}, respecting the whole path, for example: ${hbm.template.path}/pojo/PojoPropertyAccessor.ftl
The contents of the file is something like this:
<#foreach property in pojo.getAllPropertiesIterator()>

    ${pojo.getPropertyGetModifiers(property)} 

    ${pojo.getJavaTypeName(property, jdk5)} 

    ${pojo.getGetterSignature(property)}() {

        return this.${property.name};

    }

    

    ${pojo.getPropertySetModifiers(property)} void set${pojo.getPropertyName(property)}

        (${pojo.getJavaTypeName(property, jdk5)} ${property.name}) 

    {

        this.${property.name} = ${property.name};

    }

</#foreach>

We can add conditionally pre/post-conditions on our set method generation just adding a little Freemarker syntax to the above source code:
<#foreach property in pojo.getAllPropertiesIterator()>

    ${pojo.getPropertyGetModifiers(property)} 

    ${pojo.getJavaTypeName(property, jdk5)} 

    ${pojo.getGetterSignature(property)}()

    {

        return this.${property.name};

    }

    

    ${pojo.getPropertySetModifiers(property)} void set${pojo.getPropertyName(property)}

        (${pojo.getJavaTypeName(property, jdk5)} ${property.name}) 

        {

      <#if pojo.hasMetaAttribute(property"pre-cond")> 

       ${c2j.getMetaAsString(property, "pre-cond","\n")} 

      </#if>      

      this.${property.name} = ${property.name};

      <#if pojo.hasMetaAttribute(property"post-cond")> 

       ${c2j.getMetaAsString(property, "post-cond","\n")} 

      </#if>        

}

</#foreach>

Now if in any .hbm.xml file we define the <meta> attributes: pre-cond or post-cond, their contents will be generated into the body of the relevant set method.
As an example let us add a pre-condition for property name preventing no Person can have an empty name. Hence we have to modify the Person.hbm.xml file like this:
<hibernate-mapping>

  <class name="Person">

  <id name="id" type="long">        

      <generator class="increment"/>

  </id>

  <property name="firstName" type="string">

      <meta attribute="pre-cond">

      if ((firstName != null) &amp;&amp; (firstName.length() == 0) ) {

        throw new IllegalArgumentException("firstName can not be an empty String");

      }

      </meta>

  </property>

</class>

</hibernate-mapping>

Finally we have to generate the Person.java class, for this we can use both Eclipse and Ant as long as you remember to set or fill in the templatepath setting. For Ant we configure <hibernatetool> task via the templatepath attribute as in:


    <target name="hbm2java">

        <taskdef name="hibernatetool"

          classname="org.hibernate.tool.ant.HibernateToolTask"

          classpathref="lib.classpath"/>

        <hibernatetool destdir="${hbm2java.dest.dir}"

          templatepath="${hbm.template.path}">

          <classpath>

            <path refid="pojo.classpath"/>

          </classpath>        

          <configuration>

            <fileset dir="${hbm2java.src.dir}">

              <include name="**/*.hbm.xml"/>

            </fileset>

          </configuration>

          <hbm2java/>

        </hibernatetool>

    </target>

Invoking the target <hbm2java> will generate on the ${hbm2java.dest.dir} the file Person.java :
// default package

import java.io.Serializable;

public class Person implements Serializable {


    public Long id;


    public String name;


    public Person(java.lang.String name) {

        this.name = name;

    }


    public Person() {

    }


    public java.lang.Long getId() {

        return this.id;

    }


    public void setId(java.lang.Long id) {

        this.id = id;

    }

    

    public java.lang.String getName() {

        return this.name;

    }


    public void setName(java.lang.String name) {

        if ((name != null) &amp;&amp; (name.length() == 0)) {

            throw new IllegalArgumentException("name can not be an empty String");

        }

        this.name = name;

    }

    }
In conclusion, this document is intended to introduce you to Hibernate plugin specific features related to tools bath for the Eclipse and Ant tasks.
In the Eclipse Plugins chapter you've learnt about a set of wizards for creating Mapping files, Configuration file, Console Configuration, got familiar with Mapping and Configuration files editors, tooling for organizing and controlling Reverse Engineering, Hibernate Console and Mapping diagram as well.
The rest chapters have shown the aspects of using the Hibernate Tools via Ant tasks.
Please, visit JBoss Tools Users Forum to leave questions or/and suggestions on the topic. Your feedback is always appreciated.