Hi(bernate),

I use OracleDialect for inserting into database with native ID generation. 
If I violate a not-null constraint, Hibernate (not the database) correctly 
throws an Exception. I do tx.rollback() then, but my POJO still contains 
automatically assigned ID (sequence). This means, it order to get it saved 
"next time", I have to manually set all my IDs back to null, which is not 
nice. I assume this is a rollback bug which probably occurs with all kind 
of Oracle database errors, not only with not-null violations which are 
detected by hibernate. The problem does not occur with HSQL, I think this 
is because the autoincrement strategy works differently.
Btw, should the SessionImpl#checkNullability(..) not be done BEFORE the 
sequence is requested from the database?

this is my reduced mapping file:


        <class name="my.TrackedHttpRequest" table="TRACKED_HTTP_REQUEST">
                <id
                        column="ID"
                        name="id"
                        type="long"
                        unsaved-value="null"
                >
                        <generator class="native" />
                </id>

                <many-to-one name="session" 
                        class="my.TrackedSession" 
                        column="SESSION_ID" 
                        cascade="save-update" 
                        not-null="true"  />

                [...]
        </class>

this is my testcase:

        public void testStoreSingleTrackedHttpRequestMisuse() throws HibernateException
        {
                // create new business object which violates not-null constraint
                TrackedHttpRequest newRequest =
 TrackingMockObjectsFactory.createDummyTrackedHttpRequest();
                // ensure no primary key set
                assertNull( newRequest.getId() );

                Session session = sessionFactory.openSession();
                Transaction tx = null;

                try
                {
                        tx = session.beginTransaction();
                        session.saveOrUpdate(aRequest);
                        tx.commit();
                    fail("Not-null-constraint NOT detected!");
                } 
                catch (HibernateException hex)
                {
                        if (tx != null)
                        {
                                tx.rollback();
                        }
                        assertNull( newRequest.getId() );
                        throw hex;
                } 
                finally
                {
                        session.close();
                }

        }

The assertNull-check after the tx.rollback() fails for Oracle.


Regards,
Jonas




-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE. 
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
hibernate-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hibernate-devel

Reply via email to