Hello, I found that annotations ignore the "@Type" definition for an "@Id" property. I attach a patch to solve the problem.
Pablo Nussembaum. @Entity @Table(name="program") public class Program { private ProgramCode code = null; @Id(generate=GeneratorType.NONE) @Column(name="id") @Type(type="programCode") //This definition was ignored by the annotations public ProgramCode getCode(){ return code; } . . . }
Index: AnnotationBinder.java =================================================================== RCS file: /cvsroot/hibernate/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java,v retrieving revision 1.82 diff -u -r1.82 AnnotationBinder.java --- AnnotationBinder.java 6 May 2005 10:57:39 -0000 1.82 +++ AnnotationBinder.java 11 May 2005 00:07:12 -0000 @@ -1,16 +1,77 @@ //$Id: AnnotationBinder.java,v 1.82 2005/05/06 10:57:39 epbernard Exp $ package org.hibernate.cfg; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.ResourceBundle; +import java.util.Set; + +import javax.persistence.AccessType; +import javax.persistence.AssociationTable; +import javax.persistence.AttributeOverride; +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.DiscriminatorType; +import javax.persistence.Embeddable; +import javax.persistence.Embedded; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedIdTable; +import javax.persistence.GeneratorType; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.InheritanceJoinColumn; +import javax.persistence.InheritanceJoinColumns; +import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.Lob; +import javax.persistence.LobType; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Serialized; +import javax.persistence.TableGenerator; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; +import javax.persistence.Version; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.FetchMode; import org.hibernate.MappingException; -import org.hibernate.validate.ClassValidator; -import org.hibernate.annotations.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; +import org.hibernate.annotations.Check; +import org.hibernate.annotations.Filter; +import org.hibernate.annotations.FilterDef; +import org.hibernate.annotations.FilterDefs; +import org.hibernate.annotations.Filters; +import org.hibernate.annotations.ParamDef; +import org.hibernate.annotations.Parameter; +import org.hibernate.annotations.Proxy; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.hibernate.annotations.Where; import org.hibernate.cfg.annotations.AbstractCollectionBinder; import org.hibernate.cfg.annotations.EntityBinder; import org.hibernate.cfg.annotations.QueryBinder; @@ -20,28 +81,32 @@ import org.hibernate.id.MultipleHiLoPerTableGenerator; import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.id.TableHiLoGenerator; -import org.hibernate.mapping.*; +import org.hibernate.mapping.Component; +import org.hibernate.mapping.DependantValue; +import org.hibernate.mapping.IdGenerator; +import org.hibernate.mapping.Join; +import org.hibernate.mapping.JoinedSubclass; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.hibernate.mapping.RootClass; +import org.hibernate.mapping.SimpleValue; +import org.hibernate.mapping.Subclass; import org.hibernate.mapping.Table; +import org.hibernate.mapping.UnionSubclass; +import org.hibernate.mapping.Value; import org.hibernate.persister.entity.JoinedSubclassEntityPersister; import org.hibernate.persister.entity.SingleTableEntityPersister; import org.hibernate.persister.entity.UnionSubclassEntityPersister; -import org.hibernate.type.*; +import org.hibernate.type.ByteArrayBlobType; +import org.hibernate.type.CharacterArrayClobType; +import org.hibernate.type.ForeignKeyDirection; +import org.hibernate.type.PrimitiveByteArrayBlobType; +import org.hibernate.type.PrimitiveCharacterArrayClobType; +import org.hibernate.type.StringClobType; +import org.hibernate.type.TypeFactory; import org.hibernate.util.ReflectHelper; import org.hibernate.util.StringHelper; - -import javax.persistence.*; -import javax.persistence.Column; -import javax.persistence.DiscriminatorType; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.*; -import java.util.List; -import java.util.Map; +import org.hibernate.validate.ClassValidator; /** * JSR 175 annotation binder @@ -639,6 +704,7 @@ //for now columns.length > 1 is impossible for @Id String generatorType = idAnn != null ? generatorType( idAnn.generate() ) : "assigned"; String generator = idAnn != null ? idAnn.generator() : ANNOTATION_STRING_DEFAULT; + Type annType = (Type) annotedElt.getAnnotation(Type.class); bindId( generatorType, generator, @@ -651,7 +717,8 @@ columnOverride, propertyAccess, entityBinder, - mappings); + mappings, + annType); if ( log.isDebugEnabled() ) { log.debug("Bind " + (isComponent ? "@Id":"@EmbeddedId") + " on " + inferredData.getPropertyName() ); } @@ -1021,7 +1091,7 @@ private static void bindId(String generatorType, String generatorName, AnnotedElementInferredData inferredData, Ejb3Column column, RootClass rootClass, Map<String, IdGenerator> localGenerators, HashMap<String, Properties> localGeneratorTables, boolean isComposite, Map<String, Column[]> columnOverride, boolean isPropertyAccess, - EntityBinder entityBinder, ExtendedMappings mappings) { + EntityBinder entityBinder, ExtendedMappings mappings, Type annType) { /* * Fill simple value and property since and Id is a property */ @@ -1030,14 +1100,22 @@ if (isComposite) { id = fillComponent(PropertyHolderBuilder.buildPropertyHolder(rootClass), inferredData, isPropertyAccess, false, entityBinder, columnOverride, mappings); } - else { - column.forceNotNull(); //this is an id + else { + Properties typeParameters = new Properties(); + String typeName = ""; + if (annType != null) { + typeName = annType.type(); + for ( Parameter param : annType.parameters() ) { + typeParameters.setProperty( param.name(), param.value() ); + } + } + column.forceNotNull(); //this is an id id = makeSimpleValue( inferredData.getPropertyName(), inferredData.getReturnedClassName(), column, persistentClassName, - "", - new Properties(), + typeName, + typeParameters, mappings ); }