[hibernate-issues] [Hibernate-JIRA] Created: (HHH-5488) Hibernate fails with two kinds of exceptions on a compsite-key join table that references two composite keys (one column shared by both foreign keys)

Karsten Wutzke (JIRA) noreply at atlassian.com
Wed Aug 18 14:01:41 EDT 2010


Hibernate fails with two kinds of exceptions on a compsite-key join table that references two composite keys (one column shared by both foreign keys)
-----------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: HHH-5488
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5488
             Project: Hibernate Core
          Issue Type: Bug
          Components: annotations, core, entity-manager
    Affects Versions: 3.6.0.Beta2, 3.5.4
         Environment: Windows 7 64bit, localhost, Tomcat 6, embedded JBoss, Hibernate 3.5.4 and 3.6.0 Beta2, MySQL 5.1.46
            Reporter: Karsten Wutzke
            Priority: Blocker


Hibernate fails with two kinds of exceptions on a compsite-key join table that references two composite keys (one column shared by both foreign keys): see ZipArea.java and PostAddress.java inside the attached file

1. When having both entity classes use the annotations as they should be (ZipArea having @Entity and @Table, PostAddress association having @ManyToOne and @JoinColumns) then I get:

18.08.2010 18:22:51 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Geo Info Test Servlet as unavailable
18.08.2010 18:22:51 org.apache.catalina.core.StandardContext loadOnStartup
SCHWERWIEGEND: Servlet /geoinfotest threw load() exception
org.hibernate.MappingException: Unable to find column with logical name: state_code in ZipAreas
	at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:573)
	at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:125)
	at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:110)
	at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1618)
	at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1541)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1457)
	at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1413)
	at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1453)
	at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1081)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:275)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:359)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
	at geoinfotest.GeoInfoTestServlet.<init>(GeoInfoTestServlet.java:16)
...

This is the most constant and frequent error. Note though, when I removed all the INDEXes from the database it sometimes happens that Hibernate can't find the column in Cities:

18.08.2010 19:37:43 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Geo Info Test Servlet as unavailable
18.08.2010 19:37:43 org.apache.catalina.core.StandardContext loadOnStartup
SCHWERWIEGEND: Servlet /geoinfotest threw load() exception
org.hibernate.MappingException: Unable to find column with logical name: state_code in Cities
	at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:573)
	at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:125)
	at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:110)
	at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1618)
	at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1541)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1457)
	at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1413)
	at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1453)
	at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1081)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:275)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:359)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
	at geoinfotest.GeoInfoTestServlet.<init>(GeoInfoTestServlet.java:16)
...

2. When outcommenting PostAddress's @ManyToOne and @JoinColumns on zipArea and leaving @Entity and @Table on ZipArea class, I get the following exception:

18.08.2010 18:05:02 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Geo Info Test Servlet as unavailable
18.08.2010 18:05:02 org.apache.catalina.core.StandardContext loadOnStartup
SCHWERWIEGEND: Servlet /geoinfotest threw load() exception
org.hibernate.AnnotationException: referencedColumnNames(country_code, state_code, name) of geoinfotest.ZipArea.city referencing geoinfotest.City not mapped to a single property
	at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:204)
	at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:110)
	at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1618)
	at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1541)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1457)
	at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1413)
	at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1453)
	at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1081)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:275)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:359)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
	at geoinfotest.GeoInfoTestServlet.<init>(GeoInfoTestServlet.java:16)
...

I have no idea what's going on. The special situation of the ZipAreas join table is that it references country_code of both tables. As a result, I have only *one* country_code column, which is used twice by ZipArea's foreign keys. Maybe that's confusing Hibernate. I can only guess. The strange thing is that Hibernate fails with City not being mapped to a single property *or* not being able to map state_code. My assumption is that Hibernate gobbles on that special design in conjunction with indexes. Just guessing though.

Here's my original forum post: https://forum.hibernate.org/viewtopic.php?f=1&t=1006411
The DB design can be viewed here: http://www.kawoolutions.com/media/geoinfo.pdf

I have attached a ZIP of the test project including an Ant build script (including deploy-local, undeploy-local, and redeploy-local targets using the Tomcat deployment tasks). I outcommented the Tomcat deploy task setup and targets.

Use "ant war" to build the distribution WAR file. I also put a MySQL DDL script into the db dir, including the above PDF, and a MySQL Workbench model. The example doesn't need data to fail. The DB name is "geoinfo". Just set your MySQL DB username and password in xml/persistence.xml (I think it's not even needed).

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