Table of contents
This document explains the requirements and the design of support utilities for persistence.
Introduction
Even though Hibernate when used with Spring is a complete persistence framework, we need
some utilities and support classes to make Hibernate easier to use.
Requirements
- The persistence framework shall make it easy to implement new persistent classes
for Hibernate with a primary key and version.
The package can be extended inthe future with for instance:
- Useful generic persistent classes such as key-value pairs, binary arrays, and persisting
documents as XML.
Design
The persistence framework provides the following:
- A interface and abstract class for making it easy to implement persistent objects.
- A base class to for implementation of Hibernate DAOs.
Structure
Package Overview
Persistence support is provided in two packages:
Package org.wamblee.persistence provides interface and utility classes for
persistence.
Support for persistent objects
The Persistent interface is the interface that every persistent object must
implement. It provides methods for getting and setting primary key and version. These
methods should only be used by DAO implementations and never (!) by application code.
Specifically, equals() and hashCode() should also not use these
methods.
Support for DAOs
The HibernateSupport class extends the Spring
HibernateDAOSupport class with useful methods for DAOs.
The following methods are provided:
- merge(): This extends the standard Hibernate merge()
operation by also setting the primary keys and versions of the object passed into the
merge operation. Standard Hibernate does not do this. Care should be taken with this
operation since it will lazy load all associations of the object passed to the merge
operation if merge was specified for the cascade attribute in the
Hibernate mapping file
Dynamics
Since the current design is trivial, no sequence diagrams are provided.
Design Rules
To use persistence support effectively, the following rules should be followed:
- Every persistent object should implement the Persistent interface
- Application functionality should not(!) depend on the primary key or version of the
object.
- The merge() method of HibernateSupport should be used with
caution as it will lazy load all assocations mapped with cascade="merge".
- A data access object should never allow low-level database exceptions to pass through,
unless the occurence of such an exception would mean that a problem in the implementation
exists.
- It is recommended to implement data access in such a way that it does not depend on
catching and interpreting database exceptions. Doing this would tie the DAO implementation
to a database in general and to certain database features in particular. Specifically,
foreign key constraints and primary keys are nice mechanism if the database has them, but
these should only be used to prevent data corruption and guard against programming errors.
Application functionality should not depend on the support of these features in the
persistence layer.