Details

    • Type: Technical task Technical task
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 4.3.0.Beta5, 4.2.7
    • Component/s: None
    • Labels:
      None
    • Last commented by a user?:
      true

      Description

      http://in.relation.to/Bloggers/OptionsForEntityDirtnessChecking is a great discussion of the current state.

      The basic idea with this feature is to allow the entity to dirty-check itself through bytecode enhancement as discussed in the Tracked approach : bytecode enhancement section. So in part the code will simply be moved over from org.hibernate.bytecode.internal.javassist.JavassistClassTransformer to org.hibernate.bytecode.enhance.spi.Enhancer.

      But also, the other part is to allow different ways to request the checking be done. Some options we discussed were:

      • instance checking (with ==) - by far the most performant option, but not feasible in cases where the state of the thing being checked can mutate internally
      • Hibernate Type checking - The Hibernate org.hibernate.type.Type for the changing attribute would be used to perform the equality check

      A related consideration is having the entity track its loaded state. This would allow for more efficient (select-before-update not needed) reattachment of enhanced entities.

        Issue Links

          Activity

          Hide
          Ståle W. Pedersen added a comment -

          Ive changed the name of the interface to SelfDirtinessTracker, it also have a clear method.
          regarding the composite problem, i havent thought this through heavily so bear with me
          is it possible to find out at this stage (in Enhancher) if a field is another entity object? if so during isDirty we could call their isDirty method instead of calling equals. if the class is annotated i think this should be easy, i guess not so easy if its mapped with xml?

          ive looked at the DefaultFlushEntityEventListener#dirtyCheck, so i think this check should only be used if the custom hasnt found anything?
          mapping the field names to the int[] should be possible i think as long as i can find how the int[] is generated originally

          btw, should i check if the entity has already been enhanced and should perhaps the dirtychecker ignore primary key fields?

          Show
          Ståle W. Pedersen added a comment - Ive changed the name of the interface to SelfDirtinessTracker, it also have a clear method. regarding the composite problem, i havent thought this through heavily so bear with me is it possible to find out at this stage (in Enhancher) if a field is another entity object? if so during isDirty we could call their isDirty method instead of calling equals. if the class is annotated i think this should be easy, i guess not so easy if its mapped with xml? ive looked at the DefaultFlushEntityEventListener#dirtyCheck, so i think this check should only be used if the custom hasnt found anything? mapping the field names to the int[] should be possible i think as long as i can find how the int[] is generated originally btw, should i check if the entity has already been enhanced and should perhaps the dirtychecker ignore primary key fields?
          Hide
          Ståle W. Pedersen added a comment - - edited

          ive added a bit better dirtychecking i believe, so it should catch person.getAddress().setCity( "austin"). i still need to add checks for fields that inherits Collection.
          the methods ive added looks like this for the SimpleEntity class we're testing with:

            private boolean $$hibernate_isEntityDirty(Object paramObject)
            {
              return (!(paramObject instanceof SelfDirtinessTracker)) || (((SelfDirtinessTracker)paramObject).$$hibernate_hasDirtyAttributes());
            }
            
            private boolean $$hibernate_areEntityFieldsDirty()
            {
              return $$hibernate_isEntityDirty($$_hibernate_read_address());
            }
            
            public boolean $$hibernate_hasDirtyAttributes()
            {
              return ((this.$$_hibernate_tracker == null) || (this.$$_hibernate_tracker.isEmpty())) && ($$hibernate_areEntityFieldsDirty());
            }
          
          Show
          Ståle W. Pedersen added a comment - - edited ive added a bit better dirtychecking i believe, so it should catch person.getAddress().setCity( "austin") . i still need to add checks for fields that inherits Collection. the methods ive added looks like this for the SimpleEntity class we're testing with: private boolean $$hibernate_isEntityDirty( Object paramObject) { return (!(paramObject instanceof SelfDirtinessTracker)) || (((SelfDirtinessTracker)paramObject).$$hibernate_hasDirtyAttributes()); } private boolean $$hibernate_areEntityFieldsDirty() { return $$hibernate_isEntityDirty($$_hibernate_read_address()); } public boolean $$hibernate_hasDirtyAttributes() { return (( this .$$_hibernate_tracker == null ) || ( this .$$_hibernate_tracker.isEmpty())) && ($$hibernate_areEntityFieldsDirty()); }
          Hide
          Ståle W. Pedersen added a comment - - edited
          Show
          Ståle W. Pedersen added a comment - - edited ive merged all the commits into one big commit here: https://github.com/stalep/hibernate-orm/commit/5b6f086bdc9d973b309a2ad97eb4591b4229bb4c
          Hide
          Steve Ebersole added a comment -

          Linked pull request

          Show
          Steve Ebersole added a comment - Linked pull request
          Hide
          Brett Meyer added a comment -

          Ståle W. Pedersen, this is going into EAP 6.2.0 ER7. Did you have any BZs open that I should attach to our upgrade ticket?

          Show
          Brett Meyer added a comment - Ståle W. Pedersen , this is going into EAP 6.2.0 ER7. Did you have any BZs open that I should attach to our upgrade ticket?

            People

            • Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development