Hi,Dan Is it become a too heavy root aggregates If we keep all the relationship between root aggregates in domain class model, especially the relationship is one To many(that is a collection in root aggregates domain class )?
The heavy root aggregates will bring us some problem in these aspects: 1)、transactional failures. Any relationship change(such as collection member add ,remove etc) will cause the root aggregates state change, so in a multi user and task environment we will experience transactional failure most likely. 2)、Performance. Query based on the root aggregates maybe consume more memory and database resources. Maybe lazyload is a must in this scene. Alain -----邮件原件----- 发件人: Dan Haywood [mailto:[email protected]] 发送时间: 2013年4月13日 16:06 收件人: dev 主题: Re: 答复: DataNucleusObjectStore.loadPojo problem On 12 April 2013 10:06, 张峰昌 <[email protected]> wrote: > Hi Dan: > I have update the isis-objectstore-jdo from 1.0.0 to > 1.0.1-SNAPSHOT,and the DataNucleusObjectStore.loadPojo works fine. > There are two reasons to use "Application style Identity" for me:. > (1)、Domain Root Entity should have their Identity, and we should model > the relationship between the Root Entities with refrence to Root > Entity's Identity insteadof to Root Entity Object directly. > References: > Effective Aggregate Design:Part II Making Aggregate work togather > Author:Vaughn Vernon > https://vaughnvernon.co/?p=139 Sorry, I don't agree. This is a style of doing DDD that (in my opinion) over-emphasises the role of root aggregates, and underemphasises the role of such things as patterns such as the module. I also detect an emphasis on aggregates with the current hype around NoSQL databases. When an aggregate = a JSON doc in MongoDB, then, yes, sure, links between aggregates must be done using Ids. But if using a mature ORM such as JDO (one that supports polymorphic relationships through interfaces), there's no reason to do this. > > (2)、Domain Root Entity Identity should not depends on > JDOHelper.getObjectId(obj). > > How does it? Especially if you use datastore-defined identity, eg as in the ToDoItem example: @javax.jdo.annotations.PersistenceCapable(identityType=IdentityType.DATASTOR E) @javax.jdo.annotations.DatastoreIdentity(strategy=javax.jdo.annotations.IdGe neratorStrategy.IDENTITY) public class ToDoItem { .. } Cheers Dan > Best Regards > > Alain > > -----邮件原件----- > 发件人: Dan Haywood [mailto:[email protected]] > 发送时间: 2013年4月11日 15:16 > 收件人: dev > 主题: Re: DataNucleusObjectStore.loadPojo problem > > Hi Alain > I suspect your JDO annotations are wrong, but before I go off on a > wrong tangent, let me ask: what is your intent for the id? should it > be assigned by the DBMS/JDO, or should it be assigned by the application? > Dan > > > On 11 April 2013 03:26, 张峰昌 <[email protected]> wrote: > > > Hi,Dan: > > > > > > > > It seems that there are problem when to recreate an pojo with > > DataNucleusObjectStore.loadPojo. The entity I have defined that use > > entity itself ID which type is java.lang.Long.It’s work fine when > > persist the entity,but will failed when load it to display in UI. > > > > The failed reason is DataNucleusObjectStore.loadPojo passed an > > javax.jdo.identity.LongIdentity typed value into > > org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById,but > > datanucleus requires Long typed value. > > > > > > > > > > > > Exception statack : > > > > javax.jdo.JDOFatalInternalException: The key value passed to > > construct a SingleFieldIdentity of type > > "javax.jdo.identity.LongIdentity" for class > > "com.thingray.party.dom.person.Person" is of an incorrect type > > ("javax.jdo.identity.LongIdentity") - should be "Long". > > > > at > > > > org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusEx > > ce > > ption( > > NucleusJDOHelper.java:561) > > > > at > > > > org.datanucleus.api.jdo.JDOPersistenceManager.newObjectIdInstance(JD > > OP > > ersist > > enceManager.java:1622) > > > > at > > > > org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersi > > st > > enceMa > > nager.java:1740) > > > > at > > > > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.l > > oa > > dPojo( > > DataNucleusObjectStore.java:390) > > > > at > > > > org.apache.isis.objectstore.jdo.datanucleus.persistence.adaptermanag > > er > > .DataN > > ucleusPojoRecreator.recreatePojo(DataNucleusPojoRecreator.java:38) > > > > at > > > > org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManag > > er > > Defaul > > t.adapterFor(AdapterManagerDefault.java:300) > > > > at > > > > org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento$Ty > > pe > > $2.rec > > reateAdapter(ObjectAdapterMemento.java:104) > > > > at > > > > org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento$Ty > > pe > > .getAd > > apter(ObjectAdapterMemento.java:170) > > > > at > > > > org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento.ge > > tO > > bjectA > > dapter(ObjectAdapterMemento.java:288) > > > > at > > > > org.apache.isis.viewer.wicket.model.models.EntityModel.load(EntityMo > > de > > l.java > > :193) > > > > > > > > The entity I have defined: > > > > > > > > > > > > import java.util.ArrayList; > > > > import java.util.List; > > > > > > > > import javax.jdo.annotations.IdGeneratorStrategy; > > > > import javax.jdo.annotations.IdentityType; > > > > import javax.jdo.annotations.Inheritance; > > > > import javax.jdo.annotations.InheritanceStrategy; > > > > import javax.jdo.annotations.PersistenceCapable; > > > > import javax.jdo.annotations.Persistent; > > > > import javax.jdo.annotations.PrimaryKey; > > > > import javax.jdo.annotations.Queries; > > > > import javax.jdo.annotations.Query; > > > > import javax.jdo.annotations.Version; > > > > import javax.jdo.annotations.VersionStrategy; > > > > > > > > import org.apache.isis.applib.annotation.Hidden; > > > > import org.apache.isis.applib.annotation.MemberOrder; > > > > import org.apache.isis.applib.annotation.Named; > > > > import org.apache.isis.applib.annotation.Optional; > > > > import org.apache.isis.applib.annotation.Title; > > > > import org.apache.isis.applib.annotation.When; > > > > import org.apache.isis.applib.value.Date; > > > > > > > > import com.thingray.party.dom.Party; > > > > import com.thingray.party.dom.person.value.GenderType; > > > > import com.thingray.party.dom.role.value.PartyRoleType; > > > > /** > > > > * > > > > * 人。 > > > > * @author alain > > > > * @version $Revision 1.0$ 2012-10-15 > > > > * @since 1.0 > > > > * @author (lastest modification by $Author$) > > > > */ > > > > @PersistenceCapable(table="PA_PERSON") > > > > @Queries({ > > > > @Query(name = "person_find_by_name", > > > > value = " SELECT FROM > > com.thingray.party.dom.person.Person " + > > > > " WHERE > > firstName.indexOf(:personName)>=0 " + > > > > " ORDER BY > > firstName"), > > > > @Query(name = "person_find_by_login_account", > > > > value = " SELECT FROM > > com.thingray.party.dom.person.Person " + > > > > " WHERE > > loginAccount==:loginAccount") > > > > }) > > > > @Inheritance(strategy=InheritanceStrategy.NEW_TABLE) > > > > @Version(strategy=VersionStrategy.VERSION_NUMBER,column="VERSION") > > > > public class Person { > > > > // {{ PartyID (参与方标识) > > > > > > > > private Long partyID; > > > > > > > > @MemberOrder(sequence = "1") > > > > @Hidden(when=When.UNTIL_PERSISTED) > > > > @Named("参与方标识") > > > > @Persistent(primaryKey = "true", valueStrategy = > > IdGeneratorStrategy.NATIVE) > > > > public Long getPartyID() { > > > > return partyID; > > > > } > > > > > > > > public void setPartyID(final Long partyID) { > > > > this.partyID = partyID; > > > > } > > > > > > > > // }} > > > > > > > > // {{ LastName (姓) > > > > private String lastName; > > > > > > > > @MemberOrder(sequence = "1") > > > > @Named("姓") > > > > @Title(sequence="1") > > > > public String getLastName() { > > > > return lastName; > > > > } > > > > > > > > public void setLastName(final String lastName) { > > > > this.lastName = lastName; > > > > } > > > > // }} > > > > > > > > // {{ FirstName (名) > > > > private String firstName; > > > > > > > > @MemberOrder(sequence = "2") > > > > @Named("名") > > > > @Title(sequence="2") > > > > public String getFirstName() { > > > > return firstName; > > > > } > > > > > > > > public void setFirstName(final String firstName) { > > > > this.firstName = firstName; > > > > } > > > > // }} > > > > } > > > > > > > > > > > > Alain > > > > > > > > > > > > > >
