[hibernate-issues] [Hibernate-JIRA] Commented: (ANN-434) Confusing error message with @EmbeddedId and @Id

Patrick Moore (JIRA) noreply at atlassian.com
Thu Sep 7 19:35:24 EDT 2006


    [ http://opensource.atlassian.com/projects/hibernate/browse/ANN-434?page=comments#action_24367 ] 

Patrick Moore commented on ANN-434:
-----------------------------------

This is the IdUsing1 actually used to produce the output:
@Entity
public class IdUsing1 {
    @EmbeddedId 
    public TransPolId transid;
    public String value;
}


> Confusing error message with @EmbeddedId and @Id
> ------------------------------------------------
>
>          Key: ANN-434
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/ANN-434
>      Project: Hibernate Annotations
>         Type: Bug

>     Versions: 3.2.0.cr1
>  Environment: Hibernate 3.2.0.cr2
>     Reporter: Patrick Moore

>
>
> trying to create an entity with embeddedid and automatically generated ids. The resulting error message was very confusing and may be a bug as well.
> (See below for sample files) Notice the message is that TransPolId doesn't have an @Id property when in fact it does. The problem is 'solved' by removing the @Id in the TransPolId class. This caused a lot of wasted time on my part please fix for the next person!
> --------------------------------------------------------------------------------
> Some additional debugging notes:
> The problem is caused in part because when expanding TransPolId to within AnnotationBinder.processElementAnnotations()
> isIdentifierMapper == false so none of the checks looking for this sort of thing execute.
> I believe the solution is to change AnnotationBinder.bindId() as follows:
> (original):
> 		if ( isComposite ) {
> 			id = fillComponent(
> 					propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor,
> 					false, entityBinder, isEmbedded, isIdentifierMapper, mappings
> 			);
> 			Component componentId = (Component) id;
> 			componentId.setKey( true );
> 			if ( componentId.getPropertySpan() == 0 ) {
> 				throw new AnnotationException( componentId.getComponentClassName() + " has no persistent id property" );
> 			}
> 		}
> (changed):
> 		if ( isComposite ) {
> 			id = fillComponent(
> 					propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor,
> 					false, entityBinder, isEmbedded, true, mappings                                       <<<<<<<<<<<<<<< isIdentifierMapper replaced by true
> 			);
> 			Component componentId = (Component) id;
> 			componentId.setKey( true );
> 			if ( componentId.getPropertySpan() == 0 ) {
> 				throw new AnnotationException( componentId.getComponentClassName() + " has no persistent id property" );
> 			}
> 		}
> Output:
> java.vm.name=Java HotSpot(TM) Client VM, cache.provider_class=org.hibernate.cache.NoCacheProvider, file.encoding=Cp1252, java.specification.version=1.5, hibernate.show_sql=true, hibernate.connection.pool_size=1}
> 16:19:01,109 DEBUG [Configuration] Preparing to build session factory with filters : {}
> 16:19:01,109 DEBUG [AnnotationConfiguration] Execute first pass mapping processing
> 16:19:01,109 DEBUG [AnnotationConfiguration] Process hbm files
> 16:19:01,109 DEBUG [AnnotationConfiguration] Process annotated classes
> 16:19:01,125 INFO  [AnnotationBinder] Binding entity from annotated class: com.transparentpolitics.core.persistence.IdUsing1
> 16:19:01,125 DEBUG [Ejb3Column] Binding column DTYPE unique false
> 16:19:01,125 DEBUG [EntityBinder] Import with entity name=IdUsing1
> 16:19:01,125 INFO  [EntityBinder] Bind entity com.transparentpolitics.core.persistence.IdUsing1 on table IdUsing1
> 16:19:01,125 DEBUG [AnnotationBinder] Processing com.transparentpolitics.core.persistence.IdUsing1 property annotation
> 16:19:01,125 DEBUG [AnnotationBinder] Processing com.transparentpolitics.core.persistence.IdUsing1 field annotation
> 16:19:01,125 DEBUG [AnnotationBinder] Processing annotations of com.transparentpolitics.core.persistence.IdUsing1.transid
> 16:19:01,125 DEBUG [Ejb3Column] Binding column transid unique false
> 16:19:01,125 DEBUG [AnnotationBinder] transid is an id
> 16:19:01,125 DEBUG [AnnotationBinder] Binding component with path: com.transparentpolitics.core.persistence.IdUsing1.transid
> 16:19:01,125 DEBUG [AnnotationBinder] Processing com.transparentpolitics.core.persistence.TransPolId field annotation
> 16:19:01,125 DEBUG [AnnotationBinder] Processing annotations of com.transparentpolitics.core.persistence.TransPolId.id
> 16:19:01,125 DEBUG [Ejb3Column] Binding column id unique false
> 16:19:01,125 DEBUG [AnnotationBinder] id is an id
> 16:19:01,125 DEBUG [SimpleValueBinder] building SimpleValue for id
> 16:19:01,125 DEBUG [PropertyBinder] Building property id
> 16:19:01,125 DEBUG [PropertyBinder] Cascading id with null
> 16:19:01,125 DEBUG [AnnotationBinder] Bind @Id on id
> org.hibernate.AnnotationException: com.transparentpolitics.core.persistence.TransPolId has no persistent id property
> 	at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1686)
> 	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1170)
> 	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:699)
> 	at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:353)
> 	at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:265)
> 	at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:682)
> 	... 20 more
> @Embeddable
> public class TransPolId implements Serializable {
>     @Id @GeneratedValue
>     public Long id;
>     @Override
>     public boolean equals(Object o) {
>         if ( o instanceof TransPolId ) {
>             return ((TransPolId)o).id.equals(id);
>         }
>         return false;
>     }
>     @Override
>     public int hashCode() {
>         return id.hashCode();
>     }
> }
> @Entity
> public class IdUsing1 {
>     @EmbeddedId 
>     public TransPolId id;
>     public String value;
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list