[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3810) Transient entities can be inserted twice on merge

Gail Badner (JIRA) noreply at atlassian.com
Thu May 14 16:38:14 EDT 2009


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

Gail Badner commented on HHH-3810:
----------------------------------

I've checked the fix into Branch_3_3 and trunk as well:
    http://anonsvn.jboss.org/repos/hibernate/core/branches/Branch_3_3/
    http://anonsvn.jboss.org/repos/hibernate/core/trunk/

> Transient entities can be inserted twice on merge
> -------------------------------------------------
>
>                 Key: HHH-3810
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3810
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.2.6, 3.3.0.GA, 3.3.1
>            Reporter: Gail Badner
>            Assignee: Gail Badner
>             Fix For: 3.2.x, 3.3.x, 3.5
>
>
> A transient entity being merged can be inserted twice if there is a cascade back to that same entity before it has been saved.
> This bug was introduced by the fix for HHH-3229.
> This can be illustrated by the following mapping (adapted from the test case at HHH-3046):
> Route -- (1 : N) -- Node -- (N : 1) -- Tour            
> There are 3 objects:
>    route (persistent) 
>    pickupNode (transient)
>    tour (transient)
> Collections are sets.
> node.route has cascade="none".
> All other associations are cascade="merge,refresh"
> route.nodes { pickupNode }
> tour.nodes = { pickupNode }
> pickupNode.route = route
> pickupNode.tour = tour
> The following shows the execution path that results in pickupNode being saved twice.
> MERGE EVENT route (persistent)
>   MERGE EVENT pickupNode (transient)
>   |  
>   | A) CASCADE_BEFORE_SAVE pickupNode
>   |    
>   |    MERGE EVENT tour (transient)
>   |    | 
>   |    | A) CASCADE_BEFORE_SAVE tour (nothing to do)
>   |    |
>   |    | B) SAVE tour
>   |    |
>   |    | C) CASCADE_AFTER_SAVE tour
>   |    |    
>   |    |    MERGE EVENT pickupNode (still transient)
>   |    |    | (BUG: embedded merge event for same transient entity!!!)
>   |    |    |    
>   |    |    | A) CASCADE_BEFORE_SAVE pickupNode
>   |    |    |
>   |    |    |    MERGE EVENT tour (skip because it is already merged)
>   |    |    |
>   |    |    | B) SAVE pickupNode 
>   |    |    |    (BUG: saved in embedded merge event!!!)
>   |    |    |
>   |    |    | C) CASCADE_AFTER_SAVE pickupNode
>   |    |    |
>   |
>   | B) SAVE pickupNode
>   |    (BUG: saved again in original merge event!!!)
>   |
>   | C) CASCADE_AFTER_SAVE pickupNode (nothing to do)
>   
> Prior to applying the fix for HHH-3229, the execution path was:
> MERGE EVENT route (persistent)
>   MERGE EVENT pickupNode (transient)
>   |  
>   | A) CASCADE_BEFORE_SAVE pickupNode
>   |    
>   |    MERGE EVENT tour (transient)
>   |    | 
>   |    | A) CASCADE_BEFORE_SAVE tour (nothing to do)
>   |    |
>   |    | B) SAVE tour
>   |    |
>   |    | C) CASCADE_AFTER_SAVE tour
>   |    |    
>   |    |    MERGE EVENT pickupNode (still transient; skip because it is already being merged)
>   |  
>   | B) SAVE pickupNode
>   |
>   | C) CASCADE_AFTER_SAVE pickupNode (nothing to do)

-- 
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