You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by joe falchetto <fa...@gmail.com> on 2011/08/03 12:33:55 UTC
problem with bulk update and @Version annotation
Hello,
I'm facing a strange problem with the @Version Annotation with field
property as Timestamp.
With a bulk update I'll get the following error:
javax.ejb.EJBException: The bean encountered a non-application exception;
nSign outested exception is:
<openjpa-1.2.1-r752877:753278 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: java.util.Date
incompatible with java.lang.String
If I change the @Version field property from a Timestamp to an int it works
fine.
I'm using OpenJPA 1.2.1, OpenEJB 3.1.4 and HSQL 1.8.1 (I have the same
problem when I use DB2.).
I build my project with Maven and I enhance the classes with the maven
plugin.
I could try to provide a simple testcase if one is needed.
I have created a simple project (starting from openejb sample) with the
following classes:
I have a sample JPA entity "Movie" wit the following attribute:
@Id
private int id;
private String director;
private String title;
private int year;
@Version
private Timestamp lastUpdate;
My unit test insert the following 4 objects in the DB:
id: 1,director=Quentin Tarantino,title:Reservoir Dogs,year:1992
id: 2,director=Quentin Tarantino,title:Kill Bill,year:2001
id: 3,director=Joel Coen,title:Fargo,year:1996
id: 4,director=Joel Coen,title:The Big Lebowski,year:1998
When I call from my unit the stateless session bean method:
public int singleUpdate(String director) {
String s = "select m from Movie as m where
m.director='"+director+"'";
Query q = entityManager.createQuery(s);
List<Movie> list = q.getResultList();
for (Iterator<Movie> iter = list.iterator(); iter.hasNext();) {
Movie movie = iter.next();
movie.setDirector("myTestsingleUpdate");
entityManager.merge(movie);
}
return list.size();
}
It successfully updates two records associated to the director=Joel Coen.
When I call from my unit test the stateless session bean method:
public int bulkUpdate(String director) {
String s = "update Movie m set m.director = 'bulkUpdate' where
m.director='"+director+"'";
Query q = entityManager.createQuery(s);
return q.executeUpdate();
}
It should update two records but I'll get the following error:
est(org.superbiz.injection.jpa.MoviesTest) Time elapsed: 0.844 sec <<<
ERROR!
javax.ejb.EJBException: The bean encountered a non-application exception;
nested exception is:
<openjpa-1.2.1-r752877:753278 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: java.util.Date
incompatible with java.lang.String
at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:359)
at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:287)
at $Proxy31.bulkUpdate(Unknown Source)
at org.superbiz.injection.jpa.MoviesTest.test(MoviesTest.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:228)
at junit.framework.TestSuite.run(TestSuite.java:223)
at
org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
at
org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
at
org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146)
at
org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at
org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
at $Proxy0.invoke(Unknown Source)
at
org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145)
at
org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
Caused by: <openjpa-1.2.1-r752877:753278 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: java.util.Date
incompatible with java.lang.String
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:814)
at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:884)
at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:880)
at
org.apache.openjpa.kernel.DelegatingQuery.updateAll(DelegatingQuery.java:565)
at
org.apache.openjpa.persistence.QueryImpl.executeUpdate(QueryImpl.java:339)
at org.superbiz.injection.jpa.MoviesImpl.bulkUpdate(MoviesImpl.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:162)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:144)
at
org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:164)
at
org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:162)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:144)
at
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:122)
at
org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:221)
at
org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:174)
at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
at
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:282)
... 27 more
Caused by: java.lang.ClassCastException: java.util.Date incompatible with
java.lang.String
at
org.apache.openjpa.jdbc.sql.DBDictionary.appendUpdates(DBDictionary.java:2085)
at
org.apache.openjpa.jdbc.sql.DBDictionary.toBulkOperation(DBDictionary.java:1930)
at org.apache.openjpa.jdbc.sql.DBDictionary.toUpdate(DBDictionary.java:1882)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeBulkOperation(JDBCStoreQuery.java:495)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeUpdate(JDBCStoreQuery.java:440)
at
org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeUpdate(ExpressionStoreQuery.java:694)
at org.apache.openjpa.kernel.QueryImpl.update(QueryImpl.java:1039)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:809)
... 52 more
As I already written, when I change the @Version field property from a
Timestamp to an int it works fine.
Any clue?
Thanks in advance
Re: problem with bulk update and @Version annotation
Posted by "f.joe" <fa...@gmail.com>.
Hello Mike,
moving to feature pack JPA 2.0 could be an issue, in my organization there
are several application running on zOS, and I suspect should be cumbersome.
We are contacting IBM support asking the fix on OpenJPA 1.2.x. and
mentioning OPENJPA-1583.
Thanks again for you precious help.
j.
--
View this message in context: http://openjpa.208410.n2.nabble.com/problem-with-bulk-update-and-Version-annotation-tp6648211p6655386.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.
Re: problem with bulk update and @Version annotation
Posted by Michael Dick <mi...@gmail.com>.
IBM provides a feature pack JPA 2.0 which will install on WebSphere version
7. You can find more information the following site:
http://www-01.ibm.com/software/webservers/appserv/was/featurepacks/osgi/
HTH
-mike
On Thu, Aug 4, 2011 at 12:54 AM, f.joe <fa...@gmail.com> wrote:
> Hi Mike,
> thanks for your reply.
>
> I have to investigate how move to 2.x version, because my application runs
> on WebSphere 7, that uses openjpa 1.2.x managed by IBM....
> Thanks for your mail,
> j
>
> --
> View this message in context:
> http://openjpa.208410.n2.nabble.com/problem-with-bulk-update-and-Version-annotation-tp6648211p6651463.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>
Re: problem with bulk update and @Version annotation
Posted by "f.joe" <fa...@gmail.com>.
Hi Mike,
thanks for your reply.
I have to investigate how move to 2.x version, because my application runs
on WebSphere 7, that uses openjpa 1.2.x managed by IBM....
Thanks for your mail,
j
--
View this message in context: http://openjpa.208410.n2.nabble.com/problem-with-bulk-update-and-Version-annotation-tp6648211p6651463.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.
Re: problem with bulk update and @Version annotation
Posted by Michael Dick <mi...@gmail.com>.
Hi,
I think you're running into
OPENJPA-1583<https://issues.apache.org/jira/browse/OPENJPA-1583>,
which is fixed in version 2.0.0 and later (but not on 1.2.x). Is moving up
to 2.x an option for you?
-mike
On Wed, Aug 3, 2011 at 5:33 AM, joe falchetto <fa...@gmail.com>wrote:
> Hello,
> I'm facing a strange problem with the @Version Annotation with field
> property as Timestamp.
> With a bulk update I'll get the following error:
> javax.ejb.EJBException: The bean encountered a non-application exception;
> nSign outested exception is:
> <openjpa-1.2.1-r752877:753278 nonfatal user error>
> org.apache.openjpa.persistence.ArgumentException: java.util.Date
> incompatible with java.lang.String
> If I change the @Version field property from a Timestamp to an int it works
> fine.
>
> I'm using OpenJPA 1.2.1, OpenEJB 3.1.4 and HSQL 1.8.1 (I have the same
> problem when I use DB2.).
> I build my project with Maven and I enhance the classes with the maven
> plugin.
> I could try to provide a simple testcase if one is needed.
>
> I have created a simple project (starting from openejb sample) with the
> following classes:
>
> I have a sample JPA entity "Movie" wit the following attribute:
> @Id
> private int id;
> private String director;
> private String title;
> private int year;
> @Version
> private Timestamp lastUpdate;
>
>
> My unit test insert the following 4 objects in the DB:
> id: 1,director=Quentin Tarantino,title:Reservoir Dogs,year:1992
> id: 2,director=Quentin Tarantino,title:Kill Bill,year:2001
> id: 3,director=Joel Coen,title:Fargo,year:1996
> id: 4,director=Joel Coen,title:The Big Lebowski,year:1998
>
> When I call from my unit the stateless session bean method:
> public int singleUpdate(String director) {
> String s = "select m from Movie as m where
> m.director='"+director+"'";
> Query q = entityManager.createQuery(s);
> List<Movie> list = q.getResultList();
> for (Iterator<Movie> iter = list.iterator(); iter.hasNext();) {
> Movie movie = iter.next();
> movie.setDirector("myTestsingleUpdate");
> entityManager.merge(movie);
>
> }
> return list.size();
> }
>
> It successfully updates two records associated to the director=Joel Coen.
> When I call from my unit test the stateless session bean method:
>
> public int bulkUpdate(String director) {
> String s = "update Movie m set m.director = 'bulkUpdate' where
> m.director='"+director+"'";
> Query q = entityManager.createQuery(s);
> return q.executeUpdate();
> }
>
> It should update two records but I'll get the following error:
> est(org.superbiz.injection.jpa.MoviesTest) Time elapsed: 0.844 sec <<<
> ERROR!
> javax.ejb.EJBException: The bean encountered a non-application exception;
> nested exception is:
> <openjpa-1.2.1-r752877:753278 nonfatal user error>
> org.apache.openjpa.persistence.ArgumentException: java.util.Date
> incompatible with java.lang.String
> at
>
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:359)
> at
>
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:287)
> at $Proxy31.bulkUpdate(Unknown Source)
> at org.superbiz.injection.jpa.MoviesTest.test(MoviesTest.java:80)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
> at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:618)
> at junit.framework.TestCase.runTest(TestCase.java:164)
> at junit.framework.TestCase.runBare(TestCase.java:130)
> at junit.framework.TestResult$1.protect(TestResult.java:110)
> at junit.framework.TestResult.runProtected(TestResult.java:128)
> at junit.framework.TestResult.run(TestResult.java:113)
> at junit.framework.TestCase.run(TestCase.java:120)
> at junit.framework.TestSuite.runTest(TestSuite.java:228)
> at junit.framework.TestSuite.run(TestSuite.java:223)
> at
>
> org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
> at
>
> org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
> at
>
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146)
> at
>
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
> at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:618)
> at
>
> org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
> at $Proxy0.invoke(Unknown Source)
> at
>
> org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145)
> at
>
> org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87)
> at
> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
> Caused by: <openjpa-1.2.1-r752877:753278 nonfatal user error>
> org.apache.openjpa.persistence.ArgumentException: java.util.Date
> incompatible with java.lang.String
> at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:814)
> at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:884)
> at org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:880)
> at
>
> org.apache.openjpa.kernel.DelegatingQuery.updateAll(DelegatingQuery.java:565)
> at
> org.apache.openjpa.persistence.QueryImpl.executeUpdate(QueryImpl.java:339)
> at org.superbiz.injection.jpa.MoviesImpl.bulkUpdate(MoviesImpl.java:53)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
> at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:618)
> at
>
> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:162)
> at
>
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:144)
> at
>
> org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:164)
> at
>
> org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:92)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
> at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:618)
> at
>
> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:162)
> at
>
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:144)
> at
>
> org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:122)
> at
>
> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:221)
> at
>
> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:174)
> at
>
> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
> at
>
> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
> at
>
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:282)
> ... 27 more
> Caused by: java.lang.ClassCastException: java.util.Date incompatible with
> java.lang.String
> at
>
> org.apache.openjpa.jdbc.sql.DBDictionary.appendUpdates(DBDictionary.java:2085)
> at
>
> org.apache.openjpa.jdbc.sql.DBDictionary.toBulkOperation(DBDictionary.java:1930)
> at
> org.apache.openjpa.jdbc.sql.DBDictionary.toUpdate(DBDictionary.java:1882)
> at
>
> org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeBulkOperation(JDBCStoreQuery.java:495)
> at
>
> org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeUpdate(JDBCStoreQuery.java:440)
> at
>
> org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeUpdate(ExpressionStoreQuery.java:694)
> at org.apache.openjpa.kernel.QueryImpl.update(QueryImpl.java:1039)
> at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:809)
> ... 52 more
>
> As I already written, when I change the @Version field property from a
> Timestamp to an int it works fine.
> Any clue?
>
> Thanks in advance
>