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