Hi Hugi, FWIW, we are in the process of solving this exact problem of detecting changes in a complex value object for Cayenne's own JSON type available since 4.2:
https://github.com/apache/cayenne/pull/443 <https://github.com/apache/cayenne/pull/443> In our case we had to do something even worse - parse a serialized JSON String to JSON to do semantic comparison to detect all possible invariants. In your case a custom ValueObjectType is the way to go. You can simply implement a proper "equals" method in your object, and provide a ValueObjectType that will do (de)serialization. It will only be called when and if needed (i.e. when a change is detected by the "equals" method). This is actually a good solution that is going to perform faster than the above. Andrus > On Jan 3, 2021, at 10:32 PM, Hugi Thordarson <h...@karlmenn.is> wrote: > > Hi all, > I've got a text column containing an object (or rather; an object structure) > that's been serialized to a JSON string. I'm currently just re-serializing > every time I change something—not very nice— so I'd like to do > something…nicer. I.e. preferably, cayenne would know that something within > the structure has changed, and take care of re-serializing for me (or let me > know I need to re-serialize before commit). > I could re-serialize everything before every commit, but for performance > reasons I'd prefer to perform re-serialization only if the structure has > actually changed. > > First thought was creating a custom ValueObjectType and just model the type > directly, but it seems like a bit of an overkill. Or perhaps it's not? > > Grateful for any suggestions. > > Cheers, > - hugi >