[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-5741) @PrimaryKeyJoinColumn(...) is not working equivalently to @JoinColumn(..., insertable = false, updatable = false)

Karsten Wutzke (JIRA) noreply at atlassian.com
Wed Mar 16 12:03:08 EDT 2011


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-5741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=40218#action_40218 ] 

Karsten Wutzke commented on HHH-5741:
-------------------------------------

This definitely is a bug. I've successfully mapped this with EclipseLink and DataNucleus. The bad thing about these mapping bugs is (as usual) that it prevents newcomers from using otherwise good technology.

> @PrimaryKeyJoinColumn(...) is not working equivalently to @JoinColumn(..., insertable = false, updatable = false)
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: HHH-5741
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5741
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: annotations, core, entity-manager, metamodel
>    Affects Versions: 3.6.0
>         Environment: Hibernate Core 3.6, HSQLDB, JavaSE, Ant
>            Reporter: Karsten Wutzke
>            Priority: Critical
>         Attachments: geoinfo-hib-joincolumn-working.zip, geoinfo-hib-primarykeyjoincolumn-broken.zip
>
>
> When annotating classes with @JoinColumn(..., insertable = false, updatable = false) validation is working as expected:
> @ManyToOne
> @JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code", insertable = false, updatable = false), @JoinColumn(name = "state_code", referencedColumnName = "state_code", insertable = false, updatable = false), @JoinColumn(name = "city_name", referencedColumnName = "name", insertable = false, updatable = false)})
> private City city = null;
> When annotating with the equivalent @PrimaryKeyJoinColumn, e.g.:
> @ManyToOne
> @PrimaryKeyJoinColumns(value = {@PrimaryKeyJoinColumn(name = "country_code", referencedColumnName = "country_code"), @PrimaryKeyJoinColumn(name = "state_code", referencedColumnName = "state_code"), @PrimaryKeyJoinColumn(name = "city_name", referencedColumnName = "name")})
> private City city = null;
> ... validation fails.
> As every child knows (*cough*) @PrimaryKeyJoinColumn(...) is equivalent to @JoinColumn(..., insertable = false, updatable = false). See here:
> http://stackoverflow.com/questions/4205628/jpa-is-primarykeyjoincolumn-the-same-as-joincolumn-insertable-u
> Stack trace:
> Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: geoinfo] Unable to build EntityManagerFactory
> 	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:911)
> 	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
> 	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
> 	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
> 	at tld.geoinfo.Main.main(Main.java:27)
> Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: tld.geoinfo.model.ZipArea column: city_name (should be mapped with insert="false" update="false")
> 	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:675)
> 	at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:697)
> 	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:719)
> 	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:473)
> 	at org.hibernate.mapping.RootClass.validate(RootClass.java:235)
> 	at org.hibernate.cfg.Configuration.validate(Configuration.java:1332)
> 	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1835)
> 	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:902)
> 	... 4 more
> Obviously, @PrimaryKeyJoinColumn is treated to be writable, which is wrong.
> I have attached two SSCCE programs using JavaSE, HSQLDB, and Ant. The one uses @JoinColumn and works, whereas the other uses @PrimaryKeyJoinColumn and doesn't work. Just enter "ant run" in a shell.

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