Hi Ravi, I don't get this issue the first time I persist the UserProfile, only subsequent times I call merge. I added the logging as you suggested and the result is puzzling. I have a value changed listener on my jsf page, and it is this is the code that calls the find method. Here is what my output is inside the valuechangelistener:
But I worked out what the issue is. When I retrieve the Country object it is of type org.apache.openjpa.enhance.com$trm$core$Country$pcsubclass. If I create a new one it is the correct type com.trm.core.Country. The former would be the enhanced version nad is throwing the error. The correct version of course would be enhanced since it is listed in my persistence.xml. This doesn't make any sense to me, also it doesn't make any sense to me why it's class type is showing as java.lang.Class but I can work around it. Confused Chris -----Original Message----- From: Ravi Palacherla [mailto:ravi.palache...@oracle.com] Sent: Tuesday, 28 July 2009 7:17 AM To: users@openjpa.apache.org Subject: RE: Very weird enhancement error - is the class enhanced or not? - OpenJPA seems confused Hi Chris, This exception can be seen if co.getClass() returns Class.class. You can may be print clazz before e.find() to see if it is correct. Once it is confirmed, then we can try to isolate the reason for why co.getClass() returns Class only for a country and not for other entities. Are you getting this exception everytime the following stack trace is traversed ? " at com.trm.jpa.services.EntityService.find(EntityService.java:80) at com.trm.beans.backing.UserListBackingBean.countryValueChanged(UserListBackin gBean.java:215)" Regards, Ravi. -----Original Message----- From: C N Davies [mailto:c...@cndavies.com] Sent: Monday, July 27, 2009 3:05 PM To: Ravi Palacherla; users@openjpa.apache.org Subject: RE: Very weird enhancement error - is the class enhanced or not? - OpenJPA seems confused Hi Ravi, Here is what gets executed: public Object find(Object co, String uid) { Class clazz = co.getClass(); Object existing = em.find(clazz, uid); return existing; } EM is an instance of the Entity Manager, but since tis code is used everywhere in my code, and the fact that the currency and the locale in the UserProfile use exactly the same code as the Country, it doesn't make sense that the Country entity is the only one giving the issue. Chris -----Original Message----- From: Ravi Palacherla [mailto:ravi.palache...@oracle.com] Sent: Tuesday, 28 July 2009 6:54 AM To: users@openjpa.apache.org; c...@cndavies.com Subject: RE: Very weird enhancement error - is the class enhanced or not? - OpenJPA seems confused Hi, What are the values passed inside "com.trm.jpa.services.EntityService.find(EntityService.java:80)" while calling entitymanager.find() ? Thanks, Ravi. -----Original Message----- From: C N Davies [mailto:c...@cndavies.com] Sent: Monday, July 27, 2009 2:40 PM To: users@openjpa.apache.org Subject: Very weird enhancement error - is the class enhanced or not? - OpenJPA seems confused I am getting a very strange error when calling persist/merge on my entity under only one specific case. Basically I have a User entity and a UserProfile Entity. The User entity has a one to one mapping to the UserProfile entity. This is all working fine. I have a Country entity, a Locale entity and Currency entity, all of which I can create,persist,merge with no issues. The problem occurs when I add a many to one relationship to my UserProfile entity for a Country entity. When I persist/merge a User entity, it cascades to it's related UserProfile which in turn cascades to its Country entity. So here is the relationship: User -à UserProfile à Country When I call persist/merge on the User entity I get this error: <openjpa-1.2.0-r422266:683325 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: No metadata was found for type "class java.lang.Class". The class is not enhanced. That doesn't make any sense because there is no generic class in the entities being saved. To confuse the issue, when I have an empty UserProfile table, I get the same error but the UserProfile does get saved. Later when I try to make a change to the UserProfile on the User and call merge, then I get the same error but the UserProfile is not updated. To confuse things even more, if I add the other two additional entities to UserProfile (currency and locale) then they work just fine. The other two entities are actually the same class as the Country class just renamed. All these classes are defined in my persistence.xml and I can do anything to them (persist/merge) if I use them by themselves, but only under the scenario described above will I get this issue. Does anyone have a clue what might be the issue? I put on trace logging but can't see any insert/update query being executed due to this metadata issue. Here is the full stacktrace: <openjpa-1.2.0-r422266:683325 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: No metadata was found for type "class java.lang.Class". The class is not enhanced. at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.ja va:298) at org.apache.openjpa.kernel.BrokerImpl.newObjectId(BrokerImpl.java:1114) at org.apache.openjpa.kernel.DelegatingBroker.newObjectId(DelegatingBroker.java :268) at org.apache.openjpa.persistence.EntityManagerImpl.find(EntityManagerImpl.java :451) at com.trm.jpa.services.EntityService.find(EntityService.java:80) at com.trm.beans.backing.UserListBackingBean.countryValueChanged(UserListBackin gBean.java:215) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl .java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.el.parser.AstValue.invoke(AstValue.java:131) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68) at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(Met hodExpressionValueChangeListener.java:80) ... 31 more 114986 trmPU TRACE [http-8080-1] openjpa.jdbc.JDBC - The batch limit is set to 0. 114995 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> executing prepstmnt 31115924 UPDATE User SET active = ?, createdate = ?, updatedate = ?, name = ?, PROFILE_ID = ? WHERE uniqueid = ? [params=(int) 1, (Timestamp) 2009-07-27 02:13:53.0, (Timestamp) 2009-07-28 06:19:59.464, (String) Christopher Davies, (String) 3051, (String) cndavies] 114996 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> [1 ms] spent 114996 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> executing prepstmnt 4155459 UPDATE UserProfile SET email = ?, fax = ?, mobile = ?, phone = ?, COUNTRY_UNIQUEID = ?, CURRENCY_UNIQUEID = ?, LOCALE_UNIQUEID = ? WHERE id = ? [params=(String) c...@cndavies.com, (String) 02 9356 4557, (String) 0403655872, (String) 02 9356 4557, (String) AL, (String) JPY, (String) en_NZ, (String) 3051] 114999 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> [3 ms] spent 115000 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> executing prepstmnt 27931988 UPDATE User SET active = ?, createdate = ?, updatedate = ?, name = ?, PROFILE_ID = ? WHERE uniqueid = ? [params=(int) 1, (Timestamp) 2009-07-27 02:13:53.0, (Timestamp) 2009-07-28 06:19:59.464, (String) Wandy Rarung, (null) null, (String) wrrarung] 115000 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> [0 ms] spent 115000 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> executing prepstmnt 26426732 UPDATE Locale SET active = ?, createdate = ?, updatedate = ?, description = ? WHERE uniqueid = ? [params=(int) 1, (Timestamp) 2009-07-28 05:19:34.0, (Timestamp) 2009-07-28 06:19:59.463, (String) English (New Zealand), (String) en_NZ] 115002 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> [2 ms] spent 115002 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> executing prepstmnt 18417789 UPDATE Currency SET active = ?, createdate = ?, updatedate = ?, country = ?, name = ? WHERE uniqueid = ? [params=(int) 1, (Timestamp) 2009-07-21 19:09:13.0, (Timestamp) 2009-07-28 06:19:59.463, (null) null, (String) Australian Dollar, (String) JPY] 115003 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> [1 ms] spent 115003 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> executing prepstmnt 8159373 UPDATE Country SET active = ?, createdate = ?, updatedate = ?, name = ? WHERE uniqueid = ? [params=(int) 1, (Timestamp) 2009-07-28 05:15:09.0, (Timestamp) 2009-07-28 06:19:59.464, (String) AUSTRALIA, (String) AL] 115004 trmPU TRACE [http-8080-1] openjpa.jdbc.SQL - <t 7444146, conn 19525584> [1 ms] spent 115029 trmPU TRACE [http-8080-1] openjpa.jdbc.JDBC - <t 7444146, conn 19525584> [25 ms] commit 115030 trmPU TRACE [http-8080-1] openjpa.jdbc.JDBC - <t 7444146, conn 19525584> [1 ms] close