Hi all, I'm currently working on a legacy system. The DB has a lot of columns where null should actually be allowed, but instead those fields are non-nullable and get other values (empty string, "0", "-1" etc) written to them to indicate the absence of a value. Yay.
Unfortunately I can't just do the right thing; make the fields nullable and start writing nulls, since that would make other (non Cayenne) parts of the system explode, so I have to create a temporary workaround while I work through each column and make it nullable and fix (or kill) the legacy apps. What I'd like to do is write my application logic as if the column was nullable, setting nulls when I want to, but when the object goes to the DB, "legacy nulls" are written to the DB instead (empty string or "-1" or whatever). I have a working solution, I just wanted to check if you guys would have a better or more performant solution or see anything potentially wrong with what I'm doing. What I'm doing is creating an interface (HasFictionalNullValues) which can be implemented by entity classes that require it. It defines a single method that can be implemented like… public class SomeEntityClass extends _SomeEntityClass implements HasFictionalNullValues { @Override Map<Property,Object> fictionalNullValues) { Map<Property,Object map = new HashMap<>(); map.put( NAME, "" ); map.put( AGE, -1 ); return map; } [...rest of class body...] } …then I add a listener to my DataDomain to catch new and updated objects public class FictionalNullValuesListener { @PrePersist( { BaseDataObject.class } ) @PreUpdate( { BaseDataObject.class } ) public void onPrePersist( BaseDataObject object ) { if( object instanceof HasFictionalNullValues ) { ((HasFictionalNullValues)object).fictionalNullValues().forEach( ( property, replacementNullValue ) -> { if( property.getFrom( object ) == null ) { property.setIn( object, replacementNullValue ); } } ); } } } Any comments on this practice or something I'm missing? Cheers, - hugi