]
Emmanuel Bernard resolved ANN-382:
----------------------------------
Resolution: Fixed
Id involving many to one may fail depending on the entity process
ordering
--------------------------------------------------------------------------
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.cr2
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: