View Full Version : Help configuring OpenJPA with Spring Framework
prashantbhat
Dec 8th, 2006, 01:28 AM
Hi ,
I'm aware that the below issue is with OpenJPA, Sorry for posting this, but in case if any of you are working with OpenJpa Please provide me some help, Thank you.
I'm having a standalone Swing application built using Spring Framework which uses
Hibernate. But I want to switch to OpenJPAI could successfuly configure, enhance the entities and database schema is also created appropriately.
But I'm facing one problem while saving an entity. The Heirarchy of entities is little complex. BaseEntity -> CompanyEntity -> Company, Branch, Department, Employee. The 'chiefPerson' of the Company is an Employee with ManyToOne relationship. and while saving company, 'chiefPerson' property is 'null'. (here although the java.util.Date is a basic property, it is throwing this exception) probably due to incorrect mapping of chiefperson to date type and createOn date to cheifPerson.
Here is the exception :
org.springframework.dao.InvalidDataAccessApiUsageE xception: Encountered unmanaged object
"Thu Dec 07 15:22:47 EST 2006 [java.util.Date ]" in persistent field " org.samanvaya.company.entity.Company.chiefPerson" of managed object "org.samanvaya.company.entity.Company@767fb3" during flush. However, this field does not allow cascade persist.
You cannot flush unmanaged objects.; FailedObject: Thu Dec 07 15:22:47 EST 2006 [ java.util.Date]
Caused by: <4|false|0.0.0> org.apache.openjpa.persistence.InvalidStateExcepti on: Encountered unmanaged object "Thu Dec 07 15:22:47 EST 2006 [java.util.Date]" in persistent field " org.samanvaya.company.entity.Company.chiefPerson" of managed object "org.samanvaya.company.entity.Company@767fb3" during flush. However, this field does not allow cascade persist. You cannot flush unmanaged objects. FailedObject: Thu Dec 07 15:22:47 EST 2006 [ java.util.Date]
at org.apache.openjpa.kernel.SingleFieldManager.preFl ushPC(SingleFieldManager.java:746)
at org.apache.openjpa.kernel.SingleFieldManager.preFl ush(SingleFieldManager.java:587)
at org.apache.openjpa.kernel.SingleFieldManager.preFl ush (SingleFieldManager.java:555)
at org.apache.openjpa.kernel.SingleFieldManager.preFl ush(SingleFieldManager.java:471)
at org.apache.openjpa.kernel.StateManagerImpl.preFlus h(StateManagerImpl.java:2667)
at org.apache.openjpa.kernel.PNewState.beforeFlush(PN ewState.java:36)
at org.apache.openjpa.kernel.StateManagerImpl.beforeF lush(StateManagerImpl.java:845)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerI mpl.java :1865)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(Bro kerImpl.java:1825)
at org.apache.openjpa.kernel.BrokerImpl.beforeComplet ion(BrokerImpl.java:1756)
at org.apache.openjpa.kernel.LocalManagedRuntime.comm it (LocalManagedRuntime.java:76)
at org.apache.openjpa.kernel.BrokerImpl.commit(Broker Impl.java:1313)
at org.apache.openjpa.kernel.DelegatingBroker.commit( DelegatingBroker.java:863)
at org.apache.openjpa.persistence.EntityManagerImpl.c ommit (EntityManagerImpl.java:377)
at org.springframework.orm.jpa.JpaTransactionManager. doCommit(JpaTransactionManager.java:419)
at org.springframework.transaction.support.AbstractPl atformTransactionManager.processCommit (AbstractPlatformTransactionManager.java:611)
at org.springframework.transaction.support.AbstractPl atformTransactionManager.commit(AbstractPlatformTr ansactionManager.java:581)
at org.springframework.transaction.interceptor.Transa ctionAspectSupport.commitTransactionAfterReturning (TransactionAspectSupport.java:307)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:117)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed (ReflectiveMethodInvocation.java:176)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:210)
at $Proxy6.save(Unknown Source)
at org.samanvaya.company.service.CompanyService.creat eCompany (CompanyService.java:50)
Infact when tried further, I noticed that mapping between properties is incorrect, I mean a property of Date type is matching to the chiefPerson of type Employee and vice versa.
I'm using the latest snapshot of OpenJPA and SpringFrameowrk-2.0.1. Your help will be very usefull.
Thanks and Regards,
Prashant
cwash5
Dec 8th, 2006, 10:54 AM
The following is all the configuration you need to get Spring to work with OpenJPA.
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityMa nagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAd apter">
<property name="database" value="MYSQL"/>
<property name="showSql" value="true"/>
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
Class org.springframework.orm.jpa.vendor.OpenJpaVendorAd apter was added as a part of Spring 2.0.1.
The error that you have indicates that when trying to flush the persistence provider has found an entity that is not managed. What operation are you using on EntityManager persist() or merge()?
Caleb
prashantbhat
Dec 8th, 2006, 09:09 PM
Hi Caleb,
Thanks for your reply. But I think my Spring configuration is correct.
(I'm running in JavaSE5 env with JPF(Java plugin framework) that uses it's own plugin classloader. )
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityMa nagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.Simple LoadTimeWeaver" />
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAd apter">
<property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.MySQLDictionary" />
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
When I use merge
@Transactional
public void save(final BaseEntity entity) throws DataAccessException {
getJpaTemplate().merge(entity);
}
I get the following error :
org.springframework.orm.jpa.JpaSystemException: nested exception is <0|true|0.0.0> org.apache.openjpa.persistence.PersistenceExceptio n: null
Caused by:
<0|true|0.0.0> org.apache.openjpa.persistence.PersistenceExceptio n: null
at org.samanvaya.company.BaseEntity.pcCopyKeyFieldsTo ObjectId(BaseEntity.java)
at org.apache.openjpa.util.ApplicationIds.create(Appl icationIds.java:383)
at org.apache.openjpa.kernel.VersionAttachStrategy.at tach(VersionAttachStrategy.java:85)
at org.apache.openjpa.kernel.AttachManager.attach(Att achManager.java:236)
at org.apache.openjpa.kernel.AttachManager.attach(Att achManager.java:97)
at org.apache.openjpa.kernel.BrokerImpl.attach(Broker Impl.java:3124)
at org.apache.openjpa.kernel.DelegatingBroker.attach( DelegatingBroker.java:1120)
at org.apache.openjpa.persistence.EntityManagerImpl.m erge(EntityManagerImpl.java:591)
at org.springframework.orm.jpa.JpaTemplate$6.doInJpa( JpaTemplate.java:264)
at org.springframework.orm.jpa.JpaTemplate.execute(Jp aTemplate.java:183)
at org.springframework.orm.jpa.JpaTemplate.merge(JpaT emplate.java:262)
at org.samanvaya.dao.jpa.BaseDaoJpa.save(BaseDaoJpa.j ava:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoi npointUsingReflection(AopUtils.java:280)
at org.springframework.aop.framework.ReflectiveMethod Invocation.invokeJoinpoint(ReflectiveMethodInvocat ion.java:187)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :154)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:107)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :176)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:210)
at $Proxy6.save(Unknown Source)
at org.samanvaya.company.service.CompanyService.creat eCompany(CompanyService.java:50)
When I use persist, this error occurs,
org.springframework.dao.InvalidDataAccessApiUsageE xception: Encountered unmanaged object "Sat Dec 09 11:04:06 EST 2006 [java.util.Date]" in persistent field "org.samanvaya.company.entity.Company.chiefPerson" of managed object "org.samanvaya.company.entity.Company@bbd1b" during flush. However, this field does not allow cascade persist. You cannot flush unmanaged objects.; nested exception is <4|false|0.0.0> org.apache.openjpa.persistence.InvalidStateExcepti on: Encountered unmanaged object "Sat Dec 09 11:04:06 EST 2006 [java.util.Date]" in persistent field "org.samanvaya.company.entity.Company.chiefPerson" of managed object "org.samanvaya.company.entity.Company@bbd1b" during flush. However, this field does not allow cascade persist. You cannot flush unmanaged objects.
FailedObject: Sat Dec 09 11:04:06 EST 2006 [java.util.Date]
Caused by:
<4|false|0.0.0> org.apache.openjpa.persistence.InvalidStateExcepti on: Encountered unmanaged object "Sat Dec 09 11:04:06 EST 2006 [java.util.Date]" in persistent field "org.samanvaya.company.entity.Company.chiefPerson" of managed object "org.samanvaya.company.entity.Company@bbd1b" during flush. However, this field does not allow cascade persist. You cannot flush unmanaged objects.
FailedObject: Sat Dec 09 11:04:06 EST 2006 [java.util.Date]
at org.apache.openjpa.kernel.SingleFieldManager.preFl ushPC(SingleFieldManager.java:746)
at org.apache.openjpa.kernel.SingleFieldManager.preFl ush(SingleFieldManager.java:587)
at org.apache.openjpa.kernel.SingleFieldManager.preFl ush(SingleFieldManager.java:555)
at org.apache.openjpa.kernel.SingleFieldManager.preFl ush(SingleFieldManager.java:471)
at org.apache.openjpa.kernel.StateManagerImpl.preFlus h(StateManagerImpl.java:2667)
at org.apache.openjpa.kernel.PNewState.beforeFlush(PN ewState.java:36)
at org.apache.openjpa.kernel.StateManagerImpl.beforeF lush(StateManagerImpl.java:845)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerI mpl.java:1865)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(Bro kerImpl.java:1825)
at org.apache.openjpa.kernel.BrokerImpl.beforeComplet ion(BrokerImpl.java:1756)
at org.apache.openjpa.kernel.LocalManagedRuntime.comm it(LocalManagedRuntime.java:76)
at org.apache.openjpa.kernel.BrokerImpl.commit(Broker Impl.java:1313)
at org.apache.openjpa.kernel.DelegatingBroker.commit( DelegatingBroker.java:863)
at org.apache.openjpa.persistence.EntityManagerImpl.c ommit(EntityManagerImpl.java:377)
at org.springframework.orm.jpa.JpaTransactionManager. doCommit(JpaTransactionManager.java:419)
at org.springframework.transaction.support.AbstractPl atformTransactionManager.processCommit(AbstractPla tformTransactionManager.java:611)
at org.springframework.transaction.support.AbstractPl atformTransactionManager.commit(AbstractPlatformTr ansactionManager.java:581)
at org.springframework.transaction.interceptor.Transa ctionAspectSupport.commitTransactionAfterReturning (TransactionAspectSupport.java:307)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:117)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :176)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:210)
at $Proxy6.save(Unknown Source)
at org.samanvaya.company.service.CompanyService.creat eCompany(CompanyService.java:50)
And entities are also proper, as I'd used them with Hibernate earlier(not as JPA but with Hibernate Annotations)
Is there anything else that I missed out? Please suggest me.
Thanks,
Prashant
prashantbhat
Dec 8th, 2006, 10:22 PM
As I noticed in my exceptions, the field which is supposed to be of type Employee(and is null also) is being shown as date with a value, i.e. there is a mismatch of fields of the PC Class!!!
When I looked into Class org.apache.openjpa.meta.ClassMetaData, there are mthods like
getFieldsInListingOrder, getDefinedFieldsInListingOrder which sort the fields defined in the current class, super class,..
It seems to me that this is where the fields defined are getting sorted to point to different fields (Although I can't give you the exact place, the error could be here).
Sorry Once again, for posting it here, as it is purely OpenJpa Issue, but I'm not able to post to their mailing list, So please suggest me about the possible solution for this issue.
Thanks and regards,
Prashant.
cwash5
Dec 9th, 2006, 07:40 AM
Prashant,
Can you post you entity classes and your driver for these? Just want to see your interaction with how you populate the entities and interact with your save method.
Caleb
prashantbhat
Dec 10th, 2006, 10:12 PM
Hi Caleb,
Thanks, You're right. I'd missed to list the BaseEntity in the persistence.xml and I'd to specify the cascade options for all ManyToOne relationships. (I'd listed only entities but not MappedSuperClasses)
Could you clarify me whether I need to list all persistent classes on startup.
Because, the manual (http://incubator.apache.org/openjpa/docs/latest/manual/manual.html#ref_guide_pc_pcclasses) says "Unlike many ORM products, OpenJPA does not need to know about all of your persistent classes at startup."
But the note at the end says, "If your persistent class list is non-empty, OpenJPA will assume that any unlisted class is not persistent."
Which is the right approach? As my application uses plugin model to load modules(with entities) dynamically, is this supported by OpenJPA?
Thanks,
Prashant
cwash5
Dec 11th, 2006, 07:27 AM
I would try listing all of your entity classes in the persistence.xml file (including any embeddedId classes if you have any). I believe OpenJPA leverages the persistence.xml file to know which classes would need to be enhanced.
When you are testing how are you starting your test? Are you using -javaagent argument on the vm or using Spring's support that you get when you have your Junit test case extend from AbstractJpaTests? With openjpa you need to do some sort of enhancement either at runtime as list above or at buildtime using the PCEnhancerTask that comes with OpenJpa.
prashantbhat
Dec 11th, 2006, 09:32 PM
Hi Caleb,
I enhance entities at build time(Because I can't afford it at runtime:-) using PCEnhancer. (Actually, I don't have any test cases for the above and I'm currently using it with my sample code:-) And using mapping tool I could create Database schema properly. During registration window in my application entities get saved properly, but while a querying them the following error occurs:
8118 CompanyEntities INFO [AWT-EventQueue-0] openjpa.Runtime - Starting OpenJPA 0.0.0
8237 CompanyEntities INFO [AWT-EventQueue-0] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.MySQLDictionary".
8437 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Found 19 classes with metadata in 9 milliseconds.
9488 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.Role".
9777 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.CompanyEntity".
9799 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.BaseEntity".
9914 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.Branch".
9966 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.User".
10015 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.Department".
10045 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.masters.Address".
10097 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.Employee".
10157 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.Company".
10192 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.masters.City".
10220 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.masters.Country".
10241 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.masters.State".
10273 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.masters.EmployeeType".
10335 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.CategoryEntity".
10357 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.masters.Salutation".
10614 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.DocumentType".
10799 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.EmployeeRoles".
10987 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.JVersion".
11085 CompanyEntities WARN [AWT-EventQueue-0] openjpa.Enhance - The type "class org.samanvaya.company.JVersion" must have a no-args constructor. Adding a public no-args constructor.
11198 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.entity.Company".
11346 CompanyEntities INFO [AWT-EventQueue-0] openjpa.MetaData - Parsing class "org.samanvaya.company.BaseEntity".
Exception in thread "AWT-EventQueue-0" org.springframework.dao.InvalidDataAccessApiUsageE xception: The type "class org.samanvaya.company.BaseEntity" has not been enhanced.; nested exception is <4|true|0.0.0> org.apache.openjpa.persistence.ArgumentException: The type "class org.samanvaya.company.BaseEntity" has not been enhanced.
Caused by: <4|true|0.0.0> org.apache.openjpa.persistence.ArgumentException: The type "class org.samanvaya.company.BaseEntity" has not been enhanced.
at org.apache.openjpa.meta.ClassMetaData.resolveMeta( ClassMetaData.java:1590)
at org.apache.openjpa.meta.ClassMetaData.resolve(Clas sMetaData.java:1564)
at org.apache.openjpa.meta.MetaDataRepository.process Buffer(MetaDataRepository.java:656)
at org.apache.openjpa.meta.MetaDataRepository.resolve Meta(MetaDataRepository.java:556)
at org.apache.openjpa.meta.MetaDataRepository.resolve (MetaDataRepository.java:481)
at org.apache.openjpa.meta.MetaDataRepository.getMeta Data(MetaDataRepository.java:285)
at org.apache.openjpa.meta.MetaDataRepository.resolve Meta(MetaDataRepository.java:521)
at org.apache.openjpa.meta.MetaDataRepository.resolve (MetaDataRepository.java:481)
at org.apache.openjpa.meta.MetaDataRepository.getMeta Data(MetaDataRepository.java:285)
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er.getClassMetaData(JPQLExpressionBuilder.java:162 )
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er.resolveClassMetaData(JPQLExpressionBuilder.java :131)
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er.getCandidateMetaData(JPQLExpressionBuilder.java :211)
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er.getCandidateMetaData(JPQLExpressionBuilder.java :181)
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er.getCandidateType(JPQLExpressionBuilder.java:174 )
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er.access$500(JPQLExpressionBuilder.java:61)
at org.apache.openjpa.kernel.jpql.JPQLExpressionBuild er$ParsedJPQL.populate(JPQLExpressionBuilder.java: 1668)
at org.apache.openjpa.kernel.jpql.JPQLParser.populate (JPQLParser.java:52)
at org.apache.openjpa.kernel.ExpressionStoreQuery.pop ulateFromCompilation(ExpressionStoreQuery.java:145 )
at org.apache.openjpa.kernel.QueryImpl.newCompilation (QueryImpl.java:642)
at org.apache.openjpa.kernel.QueryImpl.compilationFro mCache(QueryImpl.java:623)
at org.apache.openjpa.kernel.QueryImpl.compileForComp ilation(QueryImpl.java:589)
at org.apache.openjpa.kernel.QueryImpl.compileForExec utor(QueryImpl.java:651)
at org.apache.openjpa.kernel.QueryImpl.getOperation(Q ueryImpl.java:1464)
at org.apache.openjpa.kernel.DelegatingQuery.getOpera tion(DelegatingQuery.java:120)
at org.apache.openjpa.persistence.QueryImpl.execute(Q ueryImpl.java:202)
at org.apache.openjpa.persistence.QueryImpl.getResult List(QueryImpl.java:251)
at org.springframework.orm.jpa.JpaTemplate$9.doInJpa( JpaTemplate.java:305)
at org.springframework.orm.jpa.JpaTemplate.execute(Jp aTemplate.java:183)
at org.springframework.orm.jpa.JpaTemplate.executeFin d(JpaTemplate.java:150)
at org.springframework.orm.jpa.JpaTemplate.find(JpaTe mplate.java:297)
at org.springframework.orm.jpa.JpaTemplate.find(JpaTe mplate.java:293)
at org.samanvaya.dao.jpa.BaseDaoJpa.loadAll(BaseDaoJp a.java:45)
Strange thing is that although I've enhanced all entities, the above error says, entity not enhanced!
The query is like this : getJpaTemplate().find("SELECT x FROM " + getEntityClass().getName() + " as x");
In the OpenJPA manual, through out they don't use packagename.classname while querying. So I tried with getJpaTemplate().find("SELECT x FROM Company as x");
Then the following error: java.sql.SQLException: Too many tables; MySQL can only use 61 tables in a join
As I see in the manual, default fetch depth is 1 and although my entities have circular dependency, it shouldn't lead to endless recursion I hope.
Your suggestion on this issue will be very usefull.
Thanks and Regards,
Prashant
cwash5
Dec 11th, 2006, 11:46 PM
There is no need to use the fully qualified className. Just need to className without package when writing JPQL queries.
Just a thought that you may want to specify the recursive relationships as loading lazy instead of the default which is eager. Usually with Eager loading the provider will try to do a join which may be what is getting you into a infinite loop.
prashantbhat
Dec 13th, 2006, 03:26 AM
Hi Caleb,
Thanks for your suggestions. Finally, I found the solution for "Too many tables; MySQL"
I had to to set MaxFetchDepth to 1. Default MaxFetchDepth value is -1, which symbolizes infinite depth. (Probably, making it the default would be easier for people like me:-)
And the performance of OpenJPA is really better compared to Hibernate(at least with my application in both startup and db operations). Nice to have such a great tool in Open source.
One observation is that JpaTemplate doesn't provide all methods supported by EntityManager, like executeUpdate, findSingleResult, ... It would be nice to have them in JPA template as it reduces more lines of code.
Thanks and Regards,
Prashant
vBulletin® v3.8.2, Copyright ©2000-2009, Jelsoft Enterprises Ltd.