incubator-isis-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Robert Matthews <rmatth...@nakedobjects.org>
Subject Persisting a object an aggregated component fails.
Date Fri, 22 Jun 2012 00:22:26 GMT
Hi Dan

I've been testing out the aggregated types and have found that the 
latest code no longer works.  I've had a look through but cannot see 
where the problem is being seeded.   I have a snippet of code that shows 
the problem: basically a Contact object has a collection of phone number 
objects where the phone number class is  marked as @Aggregated.  
Creating a new instance of the contact with a phone number and then 
persisting it gives the following trace.

java.lang.NullPointerException
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.adapterfactory.pojo.PojoAdapter.getResolveState(PojoAdapter.java:130)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.PersistAlgorithmAbstract.objectIsStandalone(PersistAlgorithmAbstract.java:89)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.PersistAlgorithmAbstract.alreadyPersistedOrNotPersistableOrServiceOrStandalone(PersistAlgorithmAbstract.java:64)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.dflt.DefaultPersistAlgorithm.persist(DefaultPersistAlgorithm.java:70)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.dflt.DefaultPersistAlgorithm.makePersistent(DefaultPersistAlgorithm.java:61)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.dflt.DefaultPersistAlgorithm.persist(DefaultPersistAlgorithm.java:93)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.algorithm.dflt.DefaultPersistAlgorithm.makePersistent(DefaultPersistAlgorithm.java:65)
     at 
org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession$4.execute(PersistenceSession.java:1041)
     at 
org.apache.isis.runtimes.dflt.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:151)
     at 
org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession.makePersistentInPersistenceLayer(PersistenceSession.java:1033)
     at 
org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession.makePersistent(PersistenceSession.java:1029)
     at 
org.apache.isis.runtimes.dflt.runtime.persistence.internal.RuntimeContextFromSession$5.makePersistent(RuntimeContextFromSession.java:138)
     at 
org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault.persist(DomainObjectContainerDefault.java:242)
     at 
org.apache.isis.applib.AbstractContainedObject.persist(AbstractContainedObject.java:240)
     at 
fixture.example.todo.ToDoItemsFixture.install(ToDoItemsFixture.java:39)
     at 
org.apache.isis.runtimes.dflt.runtime.fixtures.FixturesInstallerDelegate.installFixture(FixturesInstallerDelegate.java:212)

(Setting the field with the aggregate after the contact is persisted 
works though. And, storing the phone number as just a reference rather 
than adding it to a collection also works.)

Looking at the state of things when this error occurs the problem 
happens as the parent oid of the aggregate oid is the old, 
pre-persisted, oid and the object loader only has the new, now-persisted 
oid in its map so can't find the contact and hence returns null. What 
has changed since 0.3.0 (which works) to cause this to now fail?

The test code is included below.

Regards

Rob



public class TestFixture extends AbstractFixture {

     @Override
     public void install() {
         Contact c = newTransientInstance(Contact.class);
         c.setName("Fred");
         c.addPhoneNumber().setNumber("0700123456");
         persist(c);
     }
}

public class Contact extends AbstractDomainObject {

     // {{ Name
     private String name;

     @MemberOrder(sequence = "1")
     public String getName() {
         return name;
     }

     public void setName(final String name) {
         this.name = name;
     }
     // }}

     // {{ PhoneNumbers
     private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();

     @MemberOrder(sequence = "2.2")
     public List<PhoneNumber> getPhoneNumbers() {
         return phoneNumbers;
     }

     public void setPhoneNumbers(final List<PhoneNumber> phoneNumbers) {
         this.phoneNumbers = phoneNumbers;
     }
     // }}

     // {{ addPhoneNumber
     @MemberOrder(sequence = "1.1")
     public PhoneNumber addPhoneNumber() {
         PhoneNumber phoneNumber = newAggregatedInstance(PhoneNumber.class);
         getPhoneNumbers().add(phoneNumber);
         return phoneNumber;
     }
}

@Aggregated
public class PhoneNumber {

     // {{ Number
     private String number;

     @MemberOrder(sequence = "1.1")
     public String getNumber() {
         return number;
     }

     public void setNumber(final String number) {
         this.number = number;
     }
     // }}
}


Mime
View raw message