[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-5648) Auto-increment IDs should be assigned upon commit (or hooks made available)

Wallace Wadge (JIRA) noreply at atlassian.com
Tue Oct 12 04:54:59 EDT 2010


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-5648?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=38704#action_38704 ] 

Wallace Wadge commented on HHH-5648:
------------------------------------

Sorry, I might not have been clear. Let me try again.

Let's say you have a mysql table with just 1 field - the id field - set to autoincrement so the model object only contains something like:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column( name = "id", nullable = false  )
public Integer getId() {
	return this.id;
}
	

Now in the hibernate code, this value gets assigned as a result of the insert statement being generated. Therefore somewhere you'd have:
  x = insert into ....

obj.setId(x);

The key thing here is that this ID has been assigned to the object before the transaction has been committed.

Now with a connection pool like BoneCP, you can tell the pool to record any activity on a connection and, in case of a connection failure, attempt to connect again and replay all the activity on a new connection. In plain JDBC, this is not a problem -- the database would have aborted the broken transaction and a new transaction goes thru. 

With hibernate however, replaying this transaction will work at a connection and database level but hibernate never gets another chance to assign the new id to the object. Continuing on the example above, now we have

  y = insert into ...

and really we should be doing obj.setId(y) at some point.

So I'm asking: is it possible to assign the ids of objects after the transaction has been confirmed as committed instead?





> Auto-increment IDs should be assigned upon commit (or hooks made available)
> ---------------------------------------------------------------------------
>
>                 Key: HHH-5648
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5648
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>         Environment: v3.6, mysql
>            Reporter: Wallace Wadge
>
> The connection pool BoneCP (http://jolbox.com) has support to automatically replay a transaction when a database/network goes down. Under hibernate, since objects get their IDs populated upon INSERTs, the following sequence of events is possible:
> BEGIN TRANSACTION
>    INSERT STATEMENT
>    (object gets the ID field populated)
>   => network goes down, new connection is given and transaction is replayed beneath hibernate
> COMMIT TRANSACTION
> Now the database has given us a new ID but hibernate never had a chance to update the object properly.
> To fix: either assign the IDs upon a successful transaction commit or at least provide some kind of hooking mechanism so as to correct the problematic objects.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list