[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-2336) UserCollectionType: add support for ParameterizedTypes and typedef'ed types to the collection-type attribute for a collection mapping

Holger Brands (JIRA) noreply at atlassian.com
Mon Feb 19 11:21:48 EST 2007


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2336?page=all ]

Holger Brands updated HHH-2336:
-------------------------------

    Attachment: bug2336.patch

Ok, I created a patch against the 3.2 branch to fix this issue.
The patch is small, modified classes are:

o.h.cfg.HbmBinder
o.h.mapping.Collection
o.h.type.CustomCollectionType
o.h.type.TypeFactory

Existing behaviour should be unaffected with one exception:
The method signature of TypeFactory.customCollection(..) changed.
Alternatively, one could move the parameter injection to CustomCollectionType
and leave the method signature unchanged, but to me it feels more correct
to do it in the customCollection(...) method.

It would be great, if you could have a look at it and fix it in 3.2.x

Thanks,
Holger


> UserCollectionType: add support for ParameterizedTypes and typedef'ed types to the collection-type attribute for a collection mapping
> -------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: HHH-2336
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2336
>      Project: Hibernate3
>         Type: Improvement

>   Components: core
>     Versions: 3.2.1
>  Environment: Hibernate 3.2.1, independent of database platform
>     Reporter: Holger Brands
>  Attachments: bug2336.patch, usercollectionwithparameters.zip
>
>
> Currently, it's required to specify a class name as value for the collection-type attribute of a collection mapping.
> Therefore you can't use a typedef'ed type as collection-type and consequently you can't pass parameters to a custom collection type.
> Please enhance the support for custom collection types such that you can do something like this:
> <typedef name="MyEventListType" class="ca.odell.glazedlists.hibernate.EventListType">
>         <param name="category">Test</param>
> </typedef>
> <class name="User" table="`USERS`">
>         <id name="userName" column="USERNAME"/>
>         <!-- mapping a value collection -->
>         <list name="nickNames" table="USER_NICKNAMES"
>             collection-type="MyEventListType">
>             <key column="USER_ID"/>
>             <list-index column="DISPLAY_ORDER"/>
>             <element column="NAME" type="string" length="50"/>
>         </list>       
> </class>
> Currently this mapping fails with this exception:
> org.hibernate.MappingException: user colllection type class not found: MyEventListType
>    at org.hibernate.type.TypeFactory.customCollection(TypeFactory.java:267)
>    at org.hibernate.mapping.Collection.getCollectionType(Collection.java:348)
>    at org.hibernate.mapping.Collection.getType(Collection.java:340)
>    at org.hibernate.tuple.PropertyFactory.buildStandardProperty(PropertyFactory.java:120)
>    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:163)
>    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:425)
>    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
>    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
>    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
>    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
>    at ca.odell.glazedlists.hibernate.AbstractHibernateTestCase.buildSessionFactory(AbstractHibernateTestCase.java:133)
>    at ca.odell.glazedlists.hibernate.AbstractHibernateTestCase.setUp(AbstractHibernateTestCase.java:167)
>    at junit.framework.TestCase.runBare(TestCase.java:125)
>    at junit.framework.TestResult$1.protect(TestResult.java:106)
>    at junit.framework.TestResult.runProtected(TestResult.java:124)
>    at junit.framework.TestResult.run(TestResult.java:109)
>    at junit.framework.TestCase.run(TestCase.java:118)
>    at junit.framework.TestSuite.runTest(TestSuite.java:208)
>    at junit.framework.TestSuite.run(TestSuite.java:203)
>    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
>    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> Caused by: java.lang.ClassNotFoundException: MyEventListType
>    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
>    at java.security.AccessController.doPrivileged(Native Method)
>    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
>    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
>    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
>    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
>    at java.lang.Class.forName0(Native Method)
>    at java.lang.Class.forName(Class.java:164)
>    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
>    at org.hibernate.type.TypeFactory.customCollection(TypeFactory.java:264)
>    ... 24 more
> Also see the coresponding forum entry for details:
> http://forum.hibernate.org/viewtopic.php?t=969043
> Attached is a test case that demonstrates this problem.
> It's a modified copy of the existing "usercollection" test case in the Hibernate 3.2.1 distribution.
> Just copy the directory into your org.hibernate.test directory and include it in your testsuite.
> As I'm not familiar enough with the internals of Hibernate, I have no patch at hand, sorry.
> Resolving this issue would enhance mapping flexibility for custom collection types because you
> would be able to pass parameters as it's possible right now for UserTypes and CompositeUserTypes.

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