Issue Details (XML | Word | Printable)

Key: ANN-434
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Patrick Moore
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Hibernate Annotations

Confusing error message with @EmbeddedId and @Id

Created: 07/Sep/06 06:31 PM   Updated: 09/Jul/07 11:06 AM
Component/s: None
Affects Version/s: 3.2.0.cr1
Fix Version/s: 3.3.1.beta1

Time Tracking:
Not Specified

Environment: Hibernate 3.2.0.cr2


 Description  « Hide
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;
}

 All   Comments   Work Log   Change History   FishEye      Sort Order: Ascending order - Click to sort in descending order
Patrick Moore added a comment - 07/Sep/06 06:33 PM
This is the IdUsing1 actually used to produce the output:
@Entity
public class IdUsing1 {
    @EmbeddedId
    public TransPolId transid;
    public String value;
}