[hibernate-issues] [Hibernate-JIRA] Commented: (ANN-382) Exception raising : Strange behaviour depending on package names

Emmanuel Bernard (JIRA) noreply at atlassian.com
Thu Aug 17 18:12:19 EDT 2006


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

Emmanuel Bernard commented on ANN-382:
--------------------------------------

This is a quite complex graph resolution issue. Basically Hibernate Annotations does not try to reorder FK creation depending on graph dependencies (it actually does but only for the first order). Solving that is quite complex, but the easiest workaround is to use excplicit class declaration in the persistence.xml file (and possibly disable class autodiscovery).

> Exception raising : Strange behaviour depending on package names
> ----------------------------------------------------------------
>
>          Key: ANN-382
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/ANN-382
>      Project: Hibernate Annotations
>         Type: Bug

>  Environment: Hibernate's annotations packaged in JBoss EJB 3.0 RC8- FD
> Microsoft SQL Server 2000
>     Reporter: Pierre Fourès
>     Assignee: Emmanuel Bernard
>      Fix For: 3.2.0
>  Attachments: BugEJB3.zip
>
>
> As described in hibernate forum (http://forum.hibernate.org/viewtopic.php?t=960763) and discussed with Emmanuel, I encounter a strange behaviour with annotations depending of my package's names.
> Supposing hibernate load classes by package alphabetical order; if it get the "parent" class first all works fine, if it get the "child" class first, it raise an exception ! 
> Here is a subset of my classes, cleaned of getters, setters and all unrelated things, then followed by the exception stack : 
> ///////////////////////////////////////////////
> package fr.ifis.entity.field.card;
> import java.io.Serializable;
> import javax.persistence.Embeddable;
> import javax.persistence.Entity;
> import javax.persistence.Id;
> import javax.persistence.ManyToOne;
> import fr.ifis.entity.project.Card;
> @Entity
> public class CardField {
>    @Id
>     private PrimaryKey primaryKey = new PrimaryKey();
>    
>    // cardtmp is a trick used in order to wait for http://opensource.atlassian.com/projects/hibernate/browse/ANN-381 resolution 
>    @ManyToOne
>    private Card cardtmp;
>    @Embeddable
>    private class PrimaryKey implements Serializable {
>       
>       @ManyToOne(optional = false)
>       private Card card;
>       
>       @ManyToOne(optional = false)
>       private CardKey key;
>    }
> } 
> ///////////////////////////////////////////////
> package fr.ifis.entity.field.card;
> import javax.persistence.Entity;
> import javax.persistence.GeneratedValue;
> import javax.persistence.Id;
> @Entity
> public class CardKey {
>    @Id
>    @GeneratedValue
>    private int id;
> } 
> ///////////////////////////////////////////////
> package fr.ifis.entity.project;
> import java.io.Serializable;
> import java.util.Set;
> import javax.persistence.CascadeType;
> import javax.persistence.Embeddable;
> import javax.persistence.Entity;
> import javax.persistence.FetchType;
> import javax.persistence.Id;
> import javax.persistence.ManyToOne;
> import javax.persistence.OneToMany;
> import fr.ifis.entity.field.card.CardField;
> @Entity
> public class Card {
>    @Id
>     private CardPrimaryKey primaryKey = new CardPrimaryKey();
>    
>    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="cardtmp") //
>    private Set<CardField> fields;
>    
>    @Embeddable
>    private class CardPrimaryKey implements Serializable {
>       
>       @ManyToOne(optional = false)
>       private Project project;
>       
>       //An other @ManyToOne is also present in the real model
>       //The problem still occurs even when i remove this relation, it was no use to kept it for describe the problem
>    }
> } 
> ///////////////////////////////////////////////
> package fr.ifis.entity.project;
> import javax.persistence.Entity;
> import javax.persistence.GeneratedValue;
> import javax.persistence.Id;
> @Entity
> public class Project {
>    @Id
>    @GeneratedValue
>    private int id;
> } 
> ///////////////////////////////////////////////
>      [java] ERROR 29-06 19:42:18,272 (AbstractController.java:incrementState:350)  -Error installing to Start: name=persistence.units:unitName=Refonte state=Create
>      [java] org.hibernate.MappingException: Foreign key (FK6771BFAA1845E8B:CardField [])) must have same number of columns as the referenced primary key (Card [project_id])
>      [java] at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:90)
>      [java] at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:73)
>      [java] at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1182)
>      [java] at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1089)
>      [java] at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:302)
>      [java] at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1034)
>      [java] at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1015)
>      [java] at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:154)
>      [java] at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:751)
>      [java] at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:350)
>      [java] at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:119)
>      [java] at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:264)
>      [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>      [java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>      [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>      [java] at java.lang.reflect.Method.invoke(Method.java:585)
>      [java] at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:55)
>      [java] at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:107)
>      [java] at org.jboss.joinpoint.plugins.BasicMethodJoinPoint.dispatch(BasicMethodJoinPoint.java:66)
>      [java] at org.jboss.kernel.plugins.dependency.KernelControllerContextActions.dispatchJoinPoint(KernelControllerContextActions.java:100)
>      [java] at org.jboss.kernel.plugins.dependency.KernelControllerContextActions$LifecycleAction.installAction(KernelControllerContextActions.java:582)
>      [java] at org.jboss.kernel.plugins.dependency.KernelControllerContextActions$KernelControllerContextAction.install(KernelControllerContextActions.java:175)
>      [java] at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
>      [java] at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:226)
>      [java] at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:593)
>      [java] at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:346)
>      [java] at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:438)
>      [java] at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:379)
>      [java] at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:225)
>      [java] at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:151)
>      [java] at org.jboss.kernel.plugins.dependency.AbstractKernelController.install(AbstractKernelController.java:79)
>      [java] at org.jboss.kernel.plugins.dependency.AbstractKernelController.install(AbstractKernelController.java:73)
>      [java] at org.jboss.ejb3.MCKernelAbstraction.install(MCKernelAbstraction.java:91)
>      [java] at org.jboss.ejb3.Ejb3Deployment.startPersistenceUnits(Ejb3Deployment.java:626)
>      [java] at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:475)
>      [java] at org.jboss.ejb3.embedded.EJB3StandaloneDeployer.start(EJB3StandaloneDeployer.java:460)
>      [java] at org.jboss.ejb3.embedded.EJB3StandaloneBootstrap.scanClasspath(EJB3StandaloneBootstrap.java:291)
>      [java] at fr.ifis.Main.main(Unknown Source)
> ///////////////////////////////////////////////
> Indeed, depending on the package names I get or not an excpetion !
> It doesn't work with the package fr.ifis.entity.project but if I rename the package in fr.ifis.entity.aproject and then move it "before" the field.card package, all works fine.
> In order to facilitate the identification of the problem, I also include as attachement the eclipse project of this problem repport.
> In order to keep reasonable the size of the attachement, I did not included the libraries nor the configuration files for launch ejb3-embedded. Thoses files are issued from the project simple-deployment included in JBoss EJB 3.0 RC8-FD. The only change i've done was to specify in embedded-jboss-beans.xml the properties of my database.
> Regards,
> Pierre.

-- 
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