CAUSEWAY-3688: makes audit trail robust when fail to read current value for all scenarios (new, update, delete)
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
index a22cd85..6c74c48 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
@@ -83,15 +83,7 @@
         return target.getLogicalTypeName() + "#" + propertyId;
     }
 
-    public PropertyChangeRecord withPreValueSetToNew() {
-        return withPreValueSetTo(PropertyValuePlaceholder.NEW);
-    }
-
-    public PropertyChangeRecord withPreValueSetToCurrent() {
-        return withPreValueSetTo(getPropertyValue());
-    }
-
-    private PropertyChangeRecord withPreValueSetToCurrentElseUnknown() {
+    public PropertyChangeRecord withPreValueSetToCurrentElseUnknown() {
         try {
             return withPreValueSetToCurrent();
         } catch (Exception ex) {
@@ -99,21 +91,41 @@
         }
     }
 
+    private PropertyChangeRecord withPreValueSetToCurrent() {
+        return withPreValueSetTo(getPropertyValue());
+    }
+
     private PropertyChangeRecord withPreValueSetToUnknown() {
         return withPreValueSetTo(PropertyValuePlaceholder.UNKNOWN);
     }
 
-    public PropertyChangeRecord withPostValueSetToCurrent() {
-        return withPostValueSetTo(getPropertyValue());
+    private PropertyChangeRecord withPreValueSetToNew() {
+        return withPreValueSetTo(PropertyValuePlaceholder.NEW);
+    }
+
+    private PropertyChangeRecord withPreValueSetTo(Object preValue) {
+        this.preAndPostValue = PreAndPostValue.pre(preValue);
+        return this;
+    }
+
+    public PropertyChangeRecord withPostValueSetToCurrentElseUnknown() {
+        try {
+            return withPostValueSetToCurrent();
+        } catch (Exception ex) {
+            return withPostValueSetToUnknown();
+        }
     }
 
     public PropertyChangeRecord withPostValueSetToDeleted() {
         return withPostValueSetTo(PropertyValuePlaceholder.DELETED);
     }
 
-    private PropertyChangeRecord withPreValueSetTo(Object preValue) {
-        this.preAndPostValue = PreAndPostValue.pre(preValue);
-        return this;
+    private PropertyChangeRecord withPostValueSetToCurrent() {
+        return withPostValueSetTo(getPropertyValue());
+    }
+
+    private PropertyChangeRecord withPostValueSetToUnknown() {
+        return withPostValueSetTo(PropertyValuePlaceholder.UNKNOWN);
     }
 
     private PropertyChangeRecord withPostValueSetTo(Object postValue) {
diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java
index 88a5cd4..8f8a065 100644
--- a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java
+++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java
@@ -186,7 +186,7 @@
                     if(MmEntityUtils.getEntityState(rec.getEntity()).isTransientOrRemoved()) {
                         rec.withPostValueSetToDeleted();
                     } else {
-                        rec.withPostValueSetToCurrent();
+                        rec.withPostValueSetToCurrentElseUnknown();
                     }
                 })
                 .filter(managedProperty-> shouldPublish(managedProperty.getPreAndPostValue()))
@@ -375,7 +375,7 @@
                         .filter(pcrId -> ! enlistedPropertyChangeRecordsById.containsKey(pcrId)) // only if not previously seen
                         .map(pcrId -> enlistedPropertyChangeRecordsById.put(pcrId, PropertyChangeRecord.ofCurrent(pcrId)))
                         .filter(Objects::nonNull)   // shouldn't happen, just keeping compiler happy
-                        .forEach(PropertyChangeRecord::withPreValueSetToCurrent);
+                        .forEach(PropertyChangeRecord::withPreValueSetToCurrentElseUnknown);
             }
         });
     }