I have a optional relationship:
<many-to-one class="trip.model.Placemark" name="placemark" column="placemark_id" />
in the database field 'placemark_id' is allowed to have a null value
when I'm inserting a new object, property "placemark" is set to null, however, the database receive the following query:
insert into event (type, title, start_time, end_time, trip_id, placemark_id) values ('ORDERED', 'Event 4', '2008-08-16 23:44:23', '2008-08-16 23:44:23', 3, 0)
as you can see, for some reason placemark_id is being set to 0 instead of a null. This causes a referential integrity error, because there is no placemark record with id of 0.
DEBUG JDBCExceptionReporter - could not insert: [trip.model.TripEvent] [insert into event (type, title, start_time, end_time, trip_id, placemark_id) values (?, ?, ?, ?, ?, ?)]
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`platrasha_unit/event`, CONSTRAINT `FK5C6729A9F3CB679` FOREIGN KEY (`placemark_id`) REFERENCES `placemark` (`id`))
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:131)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:122)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at trip.server.dao.hibernate.HibernateTestCase.assertDataSet(HibernateTestCase.java:160)
at trip.model.TestHibernateTrip.updateTripWithNewEvent(TestHibernateTrip.java:113)
-------------------------------------------------------------
Here's what Hibernate's debug output looks like:
DEBUG AbstractSaveEventListener - saving [trip.model.TripEvent#<null>]
DEBUG AbstractSaveEventListener - executing insertions
DEBUG AbstractSaveEventListener - executing identity-insert immediately
DEBUG AbstractEntityPersister - Inserting entity: trip.model.TripEvent (native id)
DEBUG AbstractBatcher - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
DEBUG SQL - insert into event (type, title, start_time, end_time, trip_id, placemark_id) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into event (type, title, start_time, end_time, trip_id, placemark_id) values (?, ?, ?, ?, ?, ?)
DEBUG AbstractBatcher - preparing statement
DEBUG AbstractEntityPersister - Dehydrating entity: [trip.model.TripEvent#<null>]
DEBUG StringType - binding 'ORDERED' to parameter: 1
DEBUG StringType - binding 'Event 4' to parameter: 2
DEBUG TimestampType - binding '2008-08-16 23:44:23' to parameter: 3
DEBUG TimestampType - binding '2008-08-16 23:44:23' to parameter: 4
DEBUG IntegerType - binding '3' to parameter: 5
DEBUG AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
DEBUG AbstractBatcher - closing statement
I'm using Hibernate 3.2.6 with MySQL driver v. 5.0.5
|