Hi again!
I have come across another weird problem, which may or may not be a bug. It occurs on Collections where I am trying to validate the size.
Here is the constraint:
Code:
@Size( min = 1, message = "{job.categories.size}" )
@NotNull( message = "{job.categories.size}" )
private List<Category> categories = new ArrayList<Category>();
This validates 100% fine when not connected to Hibernate. However, if this is processed by Hibernate, we get a weird problem going on.
Here is the mapping in Hibernate for this collection:
Code:
<bag name="categories" table="job_to_category" lazy="false">
<key column="job_id"/>
<many-to-many class="myproject.domain.admin.Category" column="category_id"/>
</bag>
Now, when I submit a form backing object to a controller that contains this Job object that is 100% valid, I get this exception once Hibernate tries to commit/flush the session:
Code:
ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:767)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:736)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy26.editJob(Unknown Source)
at myproject.web.controllers.employer.JobsController$2.onSubmit(JobsController.java:150)
at myproject.web.helper.ProcessForm.submit(ProcessForm.java:44)
Frankly, I'm at a loss as this exception does not happen if I turn off the @Size validation. I have read that this means an object was deleted out of the session before Hibernate gets to it... but how could that happen? There are no objects being deleted here, and there is no cascading on "categories" property :(
Please help.