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 <falchetto....@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
>

Reply via email to