Cayenne
  1. Cayenne
  2. CAY-1710

Change default delete rule for runtime relationship

    Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: Core Library
    • Labels:
      None

      Description

      It should be good to change default delete rule of runtime relationship from NO_ACTION to NULLIFY. It will protect us from bogus references in dependent objects without reverse relationships.

      Suppose we have such model:

      • ARTIST(ID, NAME) ==> Artist(name, paintings)
      • PAINTING(ID, NAME, ARTIST_ID, GALLERY_ID) ==> Painting(name, artist) // no reverse to Gallery
      • GALLERY(ID, NAME) ==> Gallery(name, paintings)

      Delete rule of relationship Artist-toMany-Paintings is set to CASCADE. Expect that after deleting Artist corresponding Paintings will be deleted too.. and also deleted from galleries thanks to reverse runtime relationship Painting-toOne-Gallery created by Cayenne.

      After adding data to database (print result of SelectQuery):

      • Artists: Picasso
      • Paintings: "Girl Reading at a Table" by Picasso
      • Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by Picasso]

      After deleting object Picasso (print result of SelectQuery):

      • Artists:
      • Paintings:
      • Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by null] // that is BIZARRE!

      This happens because when cascade delete comes to painting Girl it detects relationship with delete rule NO_ACTION. And so gallery stays with bogus reference.

      PS. After recreation of ObjectContext all bogus objects of course dissapear because they do not exist in database.

        Activity

        Pavel Dyadych created issue -
        Hide
        Pavel Dyadych added a comment - - edited

        Attached sample maven project representing the problem

        Show
        Pavel Dyadych added a comment - - edited Attached sample maven project representing the problem
        Pavel Dyadych made changes -
        Field Original Value New Value
        Attachment helloworld-mapping.zip [ 12530975 ]
        Pavel Dyadych made changes -
        Description It should be good to change default delete rule of runtime relationship from NO_ACTION to NULLIFY. It will protect us from bogus references in dependent objects without reverse relationships.

        Suppose we have such model:
        * ARTIST(ID, NAME) ==> Artist(name, paintings)
        * PAINTING(ID, NAME, ARTIST_ID, GALLERY_ID) ==> Painting(name, artist) // no reverse to Gallery
        * GALLERY(ID, NAME) ==> Gallery(name, paintings)

        Delete rule of relationship Artist-toMany-Paintings is set to CASCADE. Expect that after deleting Artist corresponding Paintings will be deleted too.. and also deleted from galleries thanks to reverse runtime relationship Painting-toOne-Gallery created by Cayenne.

        After adding data to database (print result of SelectQuery):
        * Artists: Picasso
        * Paintings: "Girl Reading at a Table" by Picasso
        * Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by Picasso]

        After deleting object Picasso (print result of SelectQuery):
        * Artists:
        * Paintings:
        * Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by null] // that is BIZARRE!

        This happens because when cascading delete comes to painting Girl it detects relationship with delete rule NO_ACTION. And so gallery stays with bogus reference.

        PS. After recreation of ObjectContext all bogus objects of course dissapear because they do not exist in database.
        It should be good to change default delete rule of runtime relationship from NO_ACTION to NULLIFY. It will protect us from bogus references in dependent objects without reverse relationships.

        Suppose we have such model:
        * ARTIST(ID, NAME) ==> Artist(name, paintings)
        * PAINTING(ID, NAME, ARTIST_ID, GALLERY_ID) ==> Painting(name, artist) // no reverse to Gallery
        * GALLERY(ID, NAME) ==> Gallery(name, paintings)

        Delete rule of relationship Artist-toMany-Paintings is set to CASCADE. Expect that after deleting Artist corresponding Paintings will be deleted too.. and also deleted from galleries thanks to reverse runtime relationship Painting-toOne-Gallery created by Cayenne.

        After adding data to database (print result of SelectQuery):
        * Artists: Picasso
        * Paintings: "Girl Reading at a Table" by Picasso
        * Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by Picasso]

        After deleting object Picasso (print result of SelectQuery):
        * Artists:
        * Paintings:
        * Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by null] // that is BIZARRE!

        This happens because when cascade delete comes to painting Girl it detects relationship with delete rule NO_ACTION. And so gallery stays with bogus reference.

        PS. After recreation of ObjectContext all bogus objects of course dissapear because they do not exist in database.

          People

          • Assignee:
            Unassigned
            Reporter:
            Pavel Dyadych
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:

              Development