You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Craig Russell (JIRA)" <ji...@apache.org> on 2007/07/14 21:11:04 UTC

[jira] Commented: (OPENJPA-145) support Java5 wildcard on OpenJPA

    [ https://issues.apache.org/jira/browse/OPENJPA-145?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12512730 ] 

Craig Russell commented on OPENJPA-145:
---------------------------------------

The use of bounded typed collections is mostly for utility classes that manipulate collections. For application classes there is limited use. 

What is the difference to your application model between 

private Set<? extends AccountPerson> accountPersonCollection; ...} 

and

private Set<AccountPerson> accountPersonCollection; ...} 

In both cases, the type of instance you can put into it is an AccountPerson or a subtype. 

Is there an example that is more compelling?

> support Java5 wildcard on OpenJPA
> ---------------------------------
>
>                 Key: OPENJPA-145
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-145
>             Project: OpenJPA
>          Issue Type: Improvement
>          Components: jpa, kernel
>         Environment: OPENJPA 0.95
>            Reporter: yteng
>             Fix For: 1.0.0
>
>
> This enhancement request is to support  Java 5 wildcard on OpenJPA. The java 5 widecard is defined at 
> http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#Wildcards
> Currently, iusing java 5 widecard annotation in OpenJPA will cause org.apache.openjpa.persistence.ArgumentException
> for example
> package parent;
> public Class Account {
> ...
> @OneToMany(mappedBy="account", cascade={CascadeType.ALL})
> 	private Set<? extends AccountPerson> accountPersonCollection; ...}
> public Class AccountPerson{...}
> ______________________________________________________________________
> package child;
> public Class Account extend parent.Account {
> }
> public Class AccountPerson{..}
>  
> In such case, the parent.Account has relationship to parent.AccountPerson, while child.Account has relationship to child.AccountPerson. Now if I do not use wildcard, my test passed.  If I use wildcard, Java compile and Kodo enhancement all worked fine.  But at runtime, I got the following exception
> 766  TRACE  [main] openjpa.MetaData - 	Resolving field
> "com.psi.vida.platform.entity.pojo.Account@26757789.accountPersonCollect
> ion".
> 766  WARN   [main] openjpa.MetaData - OpenJPA cannot map field
> "com.psi.vida.platform.entity.pojo.Account.accountPersonCollection"
> efficiently.  It is of an unsupported type. The field value will be serialized to a BLOB by default. <4|true|0.9.5-incubating>
> org.apache.openjpa.persistence.ArgumentException: Errors encountered while resolving metadata.  See nested exceptions for details.
> 	at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.ja
> va:500)
> 	at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepositor
> y.java:284)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepositor
> y.java:519)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.ja
> va:480)
> 	at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepositor
> y.java:284)
> 	at
> org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2343)
> 	at
> org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2196)
> 	at kodo.kernel.KodoBroker.persist(KodoBroker.java:155)
> 	at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java
> :991)
> 	at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerIm
> pl.java:486)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> a:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> Impl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManag
> erInvocationHandler.invoke(SharedEntityManagerCreator.java:176)
> 	at $Proxy5.persist(Unknown Source)
> 	at com.psi.vida.platform.util.VidaEntityManager.saveNew(VidaEntityManager.j
> ava:160)
> 	at com.psi.vida.platform.util.VidaEntityManager.save(VidaEntityManager.java
> :114)
> 	at com.psi.vida.platform.util.VidaEntityManagerTest.testSave(VidaEntityMana
> gerTest.java:50)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> a:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> Impl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at junit.framework.TestCase.runTest(TestCase.java:154)
> 	at junit.framework.TestCase.runBare(TestCase.java:127)
> 	at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase
> .java:69)
> 	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.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTe
> stRunner.java:421)
> 	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUni
> tTestRunner.java:912)
> 	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitT
> estRunner.java:766)
> Caused by: <4|true|0.9.5-incubating>
> org.apache.openjpa.persistence.ArgumentException: Field "com.psi.vida.platform.entity.pojo.Account.accountNoteCollection" cannot declare that it is mapped by another field. Its mapping strategy
> (org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedBlobFieldStrategy) does not support mapping by another field.
> 	at org.apache.openjpa.jdbc.meta.strats.AbstractFieldStrategy.assertNotMappe
> dBy(AbstractFieldStrategy.java:56)
> 	at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedLobFieldStrategy.map(MaxE
> mbeddedLobFieldStrategy.java:73)
> 	at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedBlobFieldStrategy.map(Max
> EmbeddedBlobFieldStrategy.java:96)
> 	at
> org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:
> 117)
> 	at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(Ru
> ntimeStrategyInstaller.java:77)
> 	at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.ja
> va:435)
> 	at
> org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:400)
> 	at org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(Cla
> ssMapping.java:819)
> 	at org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRep
> ository.java:311)
> 	at org.apache.openjpa.meta.MetaDataRepository.loadMapping(MetaDataRepositor
> y.java:586)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.ja
> va:486)
> 	... 34 more
> NestedThrowables:
> <4|true|0.9.5-incubating>
> org.apache.openjpa.persistence.ArgumentException: Field "com.psi.vida.platform.entity.pojo.Account.accountPersonCollection"
> cannot declare that it is mapped by another field. Its mapping strategy
> (org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedBlobFieldStrategy) does not support mapping by another field.
> 	at org.apache.openjpa.jdbc.meta.strats.AbstractFieldStrategy.assertNotMappe
> dBy(AbstractFieldStrategy.java:56)
> 	at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedLobFieldStrategy.map(MaxE
> mbeddedLobFieldStrategy.java:73)
> 	at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedBlobFieldStrategy.map(Max
> EmbeddedBlobFieldStrategy.java:96)
> 	at
> org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:
> 117)
> 	at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(Ru
> ntimeStrategyInstaller.java:77)
> 	at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.ja
> va:435)
> 	at
> org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:400)
> 	at org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(Cla
> ssMapping.java:819)
> 	at org.apache.openjpa.jdbc.meta.ClassMapping.resolveMapping(ClassMapping.ja
> va:779)
> 	at
> org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1568)
> 	at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataReposit
> ory.java:640)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolveMapping(MetaDataReposi
> tory.java:601)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.ja
> va:492)
> 	at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepositor
> y.java:284)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepositor
> y.java:519)
> 	at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.ja
> va:480)
> 	at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepositor
> y.java:284)
> 	at
> org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2343)
> 	at
> org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2196)
> 	at kodo.kernel.KodoBroker.persist(KodoBroker.java:155)
> 	at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java
> :991)
> 	at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerIm
> pl.java:486)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> a:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> Impl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManag
> erInvocationHandler.invoke(SharedEntityManagerCreator.java:176)
> 	at $Proxy5.persist(Unknown Source)
> 	at com.psi.vida.platform.util.VidaEntityManager.saveNew(VidaEntityManager.j
> ava:160)
> 	at com.psi.vida.platform.util.VidaEntityManager.save(VidaEntityManager.java
> :114)
> 	at com.psi.vida.platform.util.VidaEntityManagerTest.testSave(VidaEntityMana
> gerTest.java:50)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> a:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> Impl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at junit.framework.TestCase.runTest(TestCase.java:154)
> 	at junit.framework.TestCase.runBare(TestCase.java:127)
> 	at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase
> .java:69)
> 	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.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTe
> stRunner.java:421)
> 	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUni
> tTestRunner.java:912)
> 	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitT
> estRunner.java:766)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.