Yeah, setPersistentState(..) was used as a simple way to intercept
lifecycle events before listeners got introduced in 3.0. Now with
listeners in the picture, certain things have changed, and
'setPersistentState' no longer works as before. (Hmm... maybe for
consistency we should hide this method from the public interface of
the object?)
BTW I think we need better exception handling in such situation
(e.g. throw
CayenneRuntimeException("Object not registered"), not just NPE).
+1.
Andrus
On Jan 21, 2009, at 3:13 PM, Andrey Razumovsky wrote:
Hi Bob,
The exception occurs because object is not yet registered when you
change
its properties. I think the best way to set default values for
object is via
LifecycleListeners. Did this work prior to M5?
BTW I think we need better exception handling in such situation
(e.g. throw
CayenneRuntimeException("Object not registered"), not just NPE). I
even
think I've seen some JIRA about it
Andrey
2009/1/21 Bob Schellink <[email protected]>
Hi all,
Perhaps this is a known issue but there seems to be a slight
regression in 3.0-M5 when overriding setPersistenceState.
When invoking dataContext#newObject a NPE is thrown.
The reason I want to override setPersistenceState is to set the
inheritance type of the hierarchy. For example:
public class Manager extends _Manager {
public void setPersistenceState(int state) {
super.setPersistenceState(state);
if(state == PersistenceState.NEW) {
setEmployeeType("MANAGER");
}
}
}
To test I use:
public static void main(String[] args) {
DataContext dc = DataContext.createDataContext();
Employee emp = (Employee) dc.newObject(Manager.class); // <-- this
call fails
dc.commitChanges();
}
Stacktrace:
Exception in thread "main" java.lang.NullPointerException
at
org.apache.cayenne.access.ObjectStore.registerDiff(ObjectStore.java:
187)
at
org
.apache
.cayenne.access.ObjectStore.nodePropertyChanged(ObjectStore.java:
1080)
at
org
.apache
.cayenne
.util
.ObjectContextGraphAction
.handleSimplePropertyChange(ObjectContextGraphAction.java:83)
at
org
.apache
.cayenne
.util
.ObjectContextGraphAction
.handlePropertyChange(ObjectContextGraphAction.java:67)
at
org
.apache.cayenne.access.DataContext.propertyChanged(DataContext.java:
1591)
at
org
.apache
.cayenne.CayenneDataObject.writeProperty(CayenneDataObject.java:226)
at test.auto._Employee.setEmployeeType(_Employee.java:16)
at test.Manager.setPersistenceState(Manager.java:13)
at
org.apache.cayenne.access.DataContext.newObject(DataContext.java:750)
at
org.apache.cayenne.access.DataContext.newObject(DataContext.java:715)
at test.Test.main(Test.java:17)
Should I open a JIRA for this?
kind regards
bob