Convertendo do Hibernate 2 para o Hibernate 3

A conversão do Cola do Hibernate 2 para Hibernate 3 iniciou com o download do CVS do hibernate da versão 3.0.4 , cujo o tag é v304:

export CVSROOT=:pserver:anonymous@cvs.sourceforge.net:/cvsroot/hibernate
cvs co -r v304 Hibernate3
          

Dica é muito melhor baixar os submódulos (src, eg ...).

Para agilizar a conversão usei um pequeno script do ANT:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<project name="renomear" default="ren" basedir=".">
    <description>
        simple example build file
    </description>
   <property name="build.hibernate.dir" location="src"/>
   
   <target name="ren" >
    <replace encoding="ISO-8859-1" dir="${build.hibernate.dir}" value="org.hibernate">
            <include name="**/*.java"/>
            <replacetoken><![CDATA[net.sf.hibernate]]></replacetoken>
          </replace>
    <replace encoding="ISO-8859-1" dir="${build.hibernate.dir}" value="org.hibernate.criterion.Expression">
            <include name="**/*.java"/>
            <replacetoken><![CDATA[org.hibernate.expression.Expression]]></replacetoken>
     </replace>
    <replace encoding="ISO-8859-1" dir="${build.hibernate.dir}" value="org.hibernate.classic.Lifecycle">
                <include name="**/*.java"/>
                <replacetoken><![CDATA[org.hibernate.Lifecycle]]></replacetoken>
    </replace>
   </target>
</project>   
          

Precisei usar encoding="ISO-8859-1" pois os arquivos estão todos nesse formato. Após rodar o script tive que fazer algumas correções, as principais foram:

Como o Hibernate 3 ainda não me fornece um meio de gerar os scripts adequadamente utilizei o patch abaixo antes de gerar o hibernate. Além de resolver o problema de geração do sql foi alterado o SessionFactoryImpl.java pois getClassmetadata não retornava um valor nulo. Este elemento do patch vai ser removido assim que for tratado este problema no código do Cola.

          Index: org/hibernate/cfg/HbmBinder.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/cfg/HbmBinder.java,v
retrieving revision 1.91
diff -u -r1.91 HbmBinder.java
--- org/hibernate/cfg/HbmBinder.java	22 May 2005 22:41:56 -0000	1.91
+++ org/hibernate/cfg/HbmBinder.java	25 May 2005 17:36:03 -0000
@@ -984,7 +984,9 @@
 		if ( uniqueKeyAttribute != null && table != null ) {
 			StringTokenizer tokens = new StringTokenizer( uniqueKeyAttribute.getValue(), ", " );
 			while ( tokens.hasMoreTokens() ) {
-				table.getOrCreateUniqueKey( tokens.nextToken() ).addColumn( column );
+				String keyName = tokens.nextToken();
+				table.getOrCreateUniqueKey( keyName ).addColumn( column );
+				column.setKeyName(keyName);
 			}
 		}
 	}
Index: org/hibernate/dialect/DerbyDialect.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/dialect/DerbyDialect.java,v
retrieving revision 1.7
diff -u -r1.7 DerbyDialect.java
--- org/hibernate/dialect/DerbyDialect.java	13 Apr 2005 04:44:34 -0000	1.7
+++ org/hibernate/dialect/DerbyDialect.java	25 May 2005 17:36:05 -0000
@@ -59,4 +59,9 @@
 	public String getQuerySequencesString() {
 	   return null ;
 	} 
+	
+    public boolean supportsUniqueConstraintNameInCreateTable() {
+		return true;
+	}
+
 }
Index: org/hibernate/dialect/Dialect.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/dialect/Dialect.java,v
retrieving revision 1.43
diff -u -r1.43 Dialect.java
--- org/hibernate/dialect/Dialect.java	22 May 2005 22:08:27 -0000	1.43
+++ org/hibernate/dialect/Dialect.java	25 May 2005 17:36:05 -0000
@@ -803,6 +803,21 @@
 		return false;
 	}
 	
+	 /**
+	 * Do support to CONSTRAINT UNNAME UNIQUE (COLUMN1)
+	 * 
+	 */
+	public boolean supportsUniqueConstraintNameInCreateTable () {
+	  return false;	
+	}
+
+     /**
+	 * Do support to create cached table (HSQLDB)
+	 * @return
+	 */
+    public String getCreateTableString () {
+		return "create table ";
+    }	
 }
 
 
Index: org/hibernate/dialect/HSQLDialect.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/dialect/HSQLDialect.java,v
retrieving revision 1.26
diff -u -r1.26 HSQLDialect.java
--- org/hibernate/dialect/HSQLDialect.java	20 May 2005 04:09:23 -0000	1.26
+++ org/hibernate/dialect/HSQLDialect.java	25 May 2005 17:36:06 -0000
@@ -269,4 +269,12 @@
 		}
 
 	};
+	
+	public String getCreateTableString () {
+				return "create cached table ";
+    }
+		
+	public boolean supportsUniqueConstraintNameInCreateTable () {
+	  return true;	
+	}
 }
Index: org/hibernate/impl/SessionFactoryImpl.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/impl/SessionFactoryImpl.java,v
retrieving revision 1.78
diff -u -r1.78 SessionFactoryImpl.java
--- org/hibernate/impl/SessionFactoryImpl.java	22 May 2005 18:20:22 -0000	1.78
+++ org/hibernate/impl/SessionFactoryImpl.java	25 May 2005 17:36:10 -0000
@@ -676,6 +676,11 @@
 	}
 
 	public ClassMetadata getClassMetadata(Class persistentClass) throws HibernateException {
+		//**jfn
+		if (persistentClass == null) {
+			return null;
+		}
+		//**end-jfn
 		return getClassMetadata( persistentClass.getName() );
 	}
 
Index: org/hibernate/mapping/Column.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/mapping/Column.java,v
retrieving revision 1.16
diff -u -r1.16 Column.java
--- org/hibernate/mapping/Column.java	22 May 2005 22:41:56 -0000	1.16
+++ org/hibernate/mapping/Column.java	25 May 2005 17:36:10 -0000
@@ -33,7 +33,8 @@
 	int uniqueInteger;
 	private String checkConstraint;
 	private String comment;
-
+	private String keyName ;
+	
 	public Column() { };
 	
 	public Column(String columnName) {
@@ -262,5 +263,13 @@
 	public void setComment(String comment) {
 		this.comment = comment;
 	}
+
+	public String getKeyName() {
+		return this.keyName;
+	}
+
+	public void setKeyName(String keyName) {
+		this.keyName = keyName;
+	}
 	
 }
Index: org/hibernate/mapping/Table.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate3/src/org/hibernate/mapping/Table.java,v
retrieving revision 1.38
diff -u -r1.38 Table.java
--- org/hibernate/mapping/Table.java	22 May 2005 22:41:56 -0000	1.38
+++ org/hibernate/mapping/Table.java	25 May 2005 17:36:11 -0000
@@ -8,7 +8,10 @@
 import java.util.List;
 import java.util.Map;
 
+
 import org.apache.commons.collections.SequencedHashMap;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.hibernate.HibernateException;
 import org.hibernate.MappingException;
 import org.hibernate.dialect.Dialect;
@@ -22,7 +25,7 @@
  * @author Gavin King
  */
 public class Table implements RelationalModel, Serializable {
-
+	private static Log log = LogFactory.getLog(Table.class);
 	private String name;
 	private String schema;
 	private String catalog;
@@ -226,7 +229,7 @@
 	}
 
 	public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, String defaultSchema) throws HibernateException {
-		StringBuffer buf = new StringBuffer( "create table " )
+		StringBuffer buf = new StringBuffer( dialect.getCreateTableString() )
 				.append( getQualifiedName( dialect , defaultCatalog, defaultSchema ) )
 				.append( " (" );
 
@@ -266,13 +269,15 @@
 			boolean useUniqueConstraint = col.isUnique() && 
 					( !col.isNullable() || dialect.supportsNotNullUnique() );
 			if ( useUniqueConstraint ) {
-				if ( dialect.supportsUnique() ) {
-					buf.append( " unique" );
-				}
-				else {
-					UniqueKey uk = getOrCreateUniqueKey( col.getQuotedName( dialect ) + '_' );
-					uk.addColumn( col );
-				}
+				if ( dialect.supportsUnique() && col.getKeyName() == null ) {
+					buf.append(" unique");
+				} else {
+					if (col.getKeyName() == null) {
+						UniqueKey uk = getOrCreateUniqueKey( col.getQuotedName( dialect ) + '_' );
+						uk.addColumn( col );
+					}		
+			   }
+					
 			}
 			if ( col.hasCheckConstraint() && dialect.supportsColumnCheck() ) {
 				buf.append( " check (" )
@@ -288,12 +293,25 @@
 		}
 
 		if ( dialect.supportsUniqueConstraintInCreateAlterTable() ) {
-			Iterator ukiter = getUniqueKeyIterator();
+			/*Iterator ukiter = getUniqueKeyIterator();
 			while ( ukiter.hasNext() ) {
 				UniqueKey uk = ( UniqueKey ) ukiter.next();
 				buf.append( ", " )
 				.append( uk.sqlConstraintString( dialect ) );
-			}
+			}*/
+			Iterator ukiter = getUniqueKeyIterator();
+            while ( ukiter.hasNext() ) {
+                UniqueKey uk = (UniqueKey) ukiter.next();
+				log.debug ("Criando key: " + uk.getName());
+				if ( dialect.supportsUniqueConstraintNameInCreateTable()) {//jfn
+	                buf.append(", ")
+	                .append ("constraint ").append (uk.getName()).append (" ")
+	                .append( uk.sqlConstraintString(dialect) );
+				} else {
+	                buf.append(", ")
+                	.append( uk.sqlConstraintString(dialect) );
+				}
+            }
 		}
 		/*Iterator idxiter = getIndexIterator();
 		while ( idxiter.hasNext() ) {
          
          
CC-GNU LGPL
Este Software é licenciado sob a CC-GNU LGPL.
CC-GNU LGPL
Este Software é licenciado sob a CC-GNU LGPL.