My requirements are as follows:
1. Convert a schema separately maintained for Oracle and DB2, to Hibernate HBMs
with no loss of information.
2. Generate Schema DDLs for Oracle, DB2 and HSQLDB that are at least as
expressive
as previous schema definition.
3. Export initialization data from existing installation(s) as hibernate XMLs.
4. Import xml initialization data into new installations, where the schema was
created with
hibernate generated DDLs.
Below is a list of changes I found necessary to fulfill these requirements.
-- Specify, reverse engineer and forward engineer (generate DDL) for primary
key names. --
There is no place in the HBM to store primary-key names. Although the reverse
engineering tool has this information, it can't put it anywhere.
Requred changes:
- In the hibernate-mapping DTD; on elements "id" and "compsite-id", add
attribute "primary-key". Add support to bind this attribute and use in DDL
generation.
Special considerations:
- The current PK_ALIAS_GENERATOR does not guarantee unique names. This needs to
be addressed once these names are being used in named constraint creation.
- There are two alternatives here in terms of DDL generation. One is to use
constraint specification within the create table statement, and the other is to
use alter table statement. I prefer the create table approach, and that is the
one I implemented.
-- Add support for table/index storage clauses --
For our application, where tables have vastly different storage requirements
within the same schema, it is essential to be able to specify Oracle storage
options.
I suggest doing this using meta attributes.
-- Transient check in ForeignKeys is suspect --
According to my understanding, using persistence context's
"getDatabaseSnapshot" is not sufficient to check whether an entity is
transient, since it only checks a cache which is updated on fetch from
database. If an entity is being persisted in the same transaction, we need to
use "containsEntity(EntityKey)" to establish correct transient state.
The effect of this issue is that each entity needs to be committed to the
database in order for hibernate to resolve foreign keys correctly during
replicate-traversal of an XML document. By adding a call to
"containsEntity(EntityKey)" to the "isTransient(String, Object, Boolean,
SessionImplementor)" method, the replicate-traversal of the document can be
done in a single transaction.
Note: I wrote my own XML document repliacte-traversal method, which does not
check for hibernate's cascade-replicate settings, since my assumption is that
all elements in an XML document are supposed to be replicated irrespective of
hibernate setup.
-- Support encountering same entity multiple times during replication of XML
document --
Subsequent entities should generate updates, with the last one encountered
being the "ruling copy". This involves changes to
DefaultReplicateEventListener, adding a fetch into the session's
persistenceContext cache to see whether there is a copy in the cache before it
checks the database for the current version.
This is necessary to support importing XML documents that contain complex
structures that are not pure trees, i.e. entities can naturally appear multiple
times in the document. In most cases they will be identical, so creating an
update will do nothing anyway. What we absolutely need to avoid is to create
another insert (resulting in a primary key violation).
-- Bug in StatefulPersistenceContext, causing classcast exception --
replace:
public Object[] getCachedDatabaseSnapshot(EntityKey key) {
//TODO: assertion failure if NO_ROW
return (Object[]) entitySnapshotsByKey.get(key);
}
with:
public Object[] getCachedDatabaseSnapshot(EntityKey key) {
Object result = entitySnapshotsByKey.get(key);
if(result==NO_ROW){
return null;
} else {
return (Object[]) result;
}
}
*---
In HibernateExt:
* Use index information in hbm mapping creation *-
Probably add this to Cfg2HbmTool. Needs a new method in Table object,
"getIndexesByColumnName" or similar.
* Use primary key information in id creation *-
In JDBCBinder, set the primary key name for ids.
* Use named constraint information in hbm mapping creation --
Requires changes to templates.
>>> "Steve Ebersole" <[EMAIL PROTECTED]> 2.3.2006 17:17 >>>
The best approach is to first just describe the changes you are
proposing at a high level here on this list (i.e. the theory).
Then we can discuss the implementation details.
-Original Message-
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of
Gudlaugur Egilsson
Sent: Thursday, March 02, 2006 10:37 AM
To: hibernate-devel@lists.sourceforge.net
Subject: [Hibernate] Several Patches -