I add a propertyHasBeenSet to getValueObject method. I thing make a check when update an entity bean use a temporary valueobject(populate by self not the one which return from getValueObject)can prevents null values copy to bean's property.
file: entity-value.xdt /* Value Objects BEGIN */ <XDtComment:comment> This part adds methods to handle 1-n relationships to add/remove/update one entry of a specific relationship. Difference is made between aggregation and composition </XDtComment:comment> <XDtEjbValueObj:forAllRelations superclasses="true" valueobject="*"> <XDtEjbValueObj:ifIsCollection> public void add<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(<XDtEjbValueObj:currentAggregateType/> added) <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose"> throws javax.ejb.CreateException </XDtMethod:ifHasMethodTag> <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="aggregate"> throws javax.ejb.FinderException </XDtMethod:ifHasMethodTag> { try { <XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>"> <XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:pkClass/> pk = added.<XDtEjbPk:primkeyGetter/>(); </XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:ifDoesntHavePrimkeyField> <XDtEjbPk:pkClass/> pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="added"/>); </XDtEjbPk:ifDoesntHavePrimkeyField> </XDtClass:pushClass> <XDtMerge:merge file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt"> </XDtMerge:merge> <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose"> <XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members"/> relation = home.create(added); </XDtMethod:ifHasMethodTag> <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="aggregate"> <XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members"/> relation = home.findByPrimaryKey(pk); </XDtMethod:ifHasMethodTag> <XDtMethod:methodName/>().add(relation); <XDtEjbCmp:ifNotUsingCmp2> makeDirty(); </XDtEjbCmp:ifNotUsingCmp2> } catch (Exception e){ <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose"> if (e instanceof javax.ejb.CreateException) throw (javax.ejb.CreateException)e; </XDtMethod:ifHasMethodTag> <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="aggregate"> if (e instanceof javax.ejb.FinderException) throw (javax.ejb.FinderException)e; </XDtMethod:ifHasMethodTag> else throw new javax.ejb.EJBException(e); } } public void remove<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(<XDtEjbValueObj:currentAggregateType/> removed) throws javax.ejb.RemoveException { try { <XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>"> <XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:pkClass/> pk = removed.<XDtEjbPk:primkeyGetter/>(); </XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:ifDoesntHavePrimkeyField> <XDtEjbPk:pkClass/> pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="removed"/>); </XDtEjbPk:ifDoesntHavePrimkeyField> </XDtClass:pushClass> <XDtMerge:merge file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt"> </XDtMerge:merge> <XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members"/> relation = home.findByPrimaryKey(pk); <XDtMethod:methodName/>().remove(relation); <XDtEjbCmp:ifNotUsingCmp2> makeDirty(); </XDtEjbCmp:ifNotUsingCmp2> <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose"> relation.remove(); </XDtMethod:ifHasMethodTag> } catch (Exception e){ if (e instanceof javax.ejb.RemoveException) throw (javax.ejb.RemoveException)e; else throw new javax.ejb.EJBException(e); } } <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose"> public void update<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(<XDtEjbValueObj:currentAggregateType/> updated) throws javax.ejb.FinderException { try { <XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>"> <XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:pkClass/> pk = updated.<XDtEjbPk:primkeyGetter/>(); </XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:ifDoesntHavePrimkeyField> <XDtEjbPk:pkClass/> pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="updated"/>); </XDtEjbPk:ifDoesntHavePrimkeyField> </XDtClass:pushClass> <XDtMerge:merge file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt"> </XDtMerge:merge> <XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members"/> relation = home.findByPrimaryKey(pk); relation.set<XDtEjbValueObj:currentAggregateType short="true"/>(updated); } catch (Exception e){ if (e instanceof javax.ejb.FinderException) throw (javax.ejb.FinderException)e; else throw new javax.ejb.EJBException(e); } } </XDtMethod:ifHasMethodTag> </XDtEjbValueObj:ifIsCollection> </XDtEjbValueObj:forAllRelations> <XDtEjbValueObj:forAllValueObjects> private <XDtEjbValueObj:currentValueObjectClass/> <XDtEjbValueObj:currentValueObjectAttribute/> = null; public <XDtEjbValueObj:valueMostSuperObjectClass/> get<XDtEjbValueObj:currentValueObjectAttribute/>() { <XDtEjbValueObj:currentValueObjectAttribute/> = new <XDtEjbValueObj:currentValueObjectClass/>(); <XDtMerge:merge file="xdoclet/modules/ejb/entity/resources/entity-value-instantiation.xdt"> </XDtMerge:merge> <XDtEjbPersistent:forAllPersistentFields valueobject="<XDtEjbValueObj:currentValueObjectMatch/>"> <XDtMethod:ifHasMethod name="<XDtMethod:setterMethod/>" parameters="<XDtMethod:methodType/>"> <XDtMethod:ifMethodTagValueEquals tagName="ejb:value-object" paramName="relation" value="external"> <XDtEjbValueObj:currentValueObjectAttribute/>.<XDtMethod:setterMethod/>( <XDtMethod:getterMethod/>() ); </XDtMethod:ifMethodTagValueEquals> </XDtMethod:ifHasMethod> </XDtEjbPersistent:forAllPersistentFields> return <XDtEjbValueObj:currentValueObjectAttribute/>; } </XDtEjbValueObj:forAllValueObjects> <XDtEjbValueObj:forAllSuperSetValue> public void set<XDtEjbValueObj:currentValueObjectAttribute/>( <XDtEjbValueObj:currentValueObjectClass/> valueHolder ) <XDtMethod:exceptionList method="set<XDtEjbValueObj:currentValueObjectAttribute/>"/>{ <XDtMethod:ifHasMethod name="validate" parameters="<XDtEjbValueObj:currentValueObjectClass/>"> validate(valueHolder); </XDtMethod:ifHasMethod> <XDtEjbBmp:ifUseSoftLocking> if( getVersion() != valueHolder.getVersion() ) throw new IllegalStateException( "Wrong version. Had " + getVersion() + ", got " + valueHolder.getVersion() ); </XDtEjbBmp:ifUseSoftLocking> try { <XDtEjbPersistent:forAllPersistentFields not-pk="true" valueobject="<XDtEjbValueObj:currentValueObjectMatch/>"> <XDtEjbPk:ifIsNotPrimkeyField> <XDtMethod:ifHasMethod name="<XDtMethod:setterMethod/>" parameters="<XDtMethod:methodType/>"> <XDtComment:comment> Check if propertyHasBeenSet, then set.. </XDtComment:comment> if (valueHolder.<XDtMethod:propertyName/>HasBeenSet()) { <XDtMethod:setterMethod/>( valueHolder.<XDtMethod:getterMethod/>() ); } </XDtMethod:ifHasMethod> </XDtEjbPk:ifIsNotPrimkeyField> </XDtEjbPersistent:forAllPersistentFields> <XDtEjbValueObj:forAllAggregates superclasses="true" valueobject="<XDtEjbValueObj:currentValueObjectMatch/>"> { <XDtEjbValueObj:ifIsNotCollection> <XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>"> // Checks for null aggregate if (valueHolder.get<XDtEjbValueObj:currentAggregateName/>() != null) { <XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:pkClass/> pk = valueHolder.get<XDtEjbValueObj:currentAggregateName/>().<XDtEjbPk:primkeyGetter/>(); </XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:ifDoesntHavePrimkeyField> <XDtEjbPk:pkClass/> pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="valueHolder.get<XDtEjbValueObj:currentAggregateName/>()"/>); </XDtEjbPk:ifDoesntHavePrimkeyField> </XDtClass:pushClass> <XDtMerge:merge file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt"> </XDtMerge:merge> <XDtMethod:methodType/> relation = home.findByPrimaryKey(pk); <XDtMethod:setterMethod/>(relation); } else { <XDtMethod:setterMethod/>(null); } </XDtEjbValueObj:ifIsNotCollection> <XDtEjbValueObj:ifIsCollection> <XDtComment:comment> Here we take what has changed (update/add/remove) inside the VO collection and call methods according to. These methods are extracted so that you can define them abstract with a ejb:interface tag to give them access from the outside. </XDtComment:comment> java.util.Iterator i<XDtEjbValueObj:currentAggregateName/> = valueHolder.getAdded<XDtEjbValueObj:currentAggregateName plural="true"/>().iterator(); while (i<XDtEjbValueObj:currentAggregateName/>.hasNext()) { <XDtEjbValueObj:currentAggregateType/> o = (<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next(); add<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(o); } i<XDtEjbValueObj:currentAggregateName/> = valueHolder.getRemoved<XDtEjbValueObj:currentAggregateName plural="true"/>().iterator(); while (i<XDtEjbValueObj:currentAggregateName/>.hasNext()) { <XDtEjbValueObj:currentAggregateType/> o = (<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next(); remove<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(o); } </XDtEjbValueObj:ifIsCollection> } </XDtEjbValueObj:forAllAggregates> <XDtEjbValueObj:forAllComposes superclasses="true" valueobject="<XDtEjbValueObj:currentValueObjectMatch/>"> // Anonymous block to allow variable declations without conflicts { <XDtEjbValueObj:ifIsNotCollection> <XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>"> // Checks for null composition if (valueHolder.get<XDtEjbValueObj:currentAggregateName/>() != null) { <XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:pkClass/> pk = valueHolder.get<XDtEjbValueObj:currentAggregateName/>().<XDtEjbPk:primkeyGetter/>(); </XDtEjbPk:ifHasPrimkeyField> <XDtEjbPk:ifDoesntHavePrimkeyField> <XDtEjbPk:pkClass/> pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="valueHolder.get<XDtEjbValueObj:currentAggregateName/>()"/>); </XDtEjbPk:ifDoesntHavePrimkeyField> </XDtClass:pushClass> <XDtMerge:merge file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt"> </XDtMerge:merge> <XDtMethod:methodType/> relation = home.findByPrimaryKey(pk); relation.set<XDtEjbValueObj:currentAggregateName/>(valueHolder.get<XDtEjbValueObj:currentAggregateName/>()); } </XDtEjbValueObj:ifIsNotCollection> <XDtEjbValueObj:ifIsCollection> <XDtComment:comment> Here we take what has changed (update/add/remove) inside the VO collection and call methods according to. These methods are extracted so that you can define them abstract with a ejb:interface tag to give them access from the outside. </XDtComment:comment> java.util.Iterator i<XDtEjbValueObj:currentAggregateName/> = valueHolder.getUpdated<XDtEjbValueObj:currentAggregateName plural="true"/>().iterator(); while (i<XDtEjbValueObj:currentAggregateName/>.hasNext()) { <XDtEjbValueObj:currentAggregateType/> o = (<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next(); update<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(o); } i<XDtEjbValueObj:currentAggregateName/> = valueHolder.getAdded<XDtEjbValueObj:currentAggregateName plural="true"/>().iterator(); while (i<XDtEjbValueObj:currentAggregateName/>.hasNext()) { <XDtEjbValueObj:currentAggregateType/> o = (<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next(); add<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(o); } i<XDtEjbValueObj:currentAggregateName/> = valueHolder.getRemoved<XDtEjbValueObj:currentAggregateName plural="true"/>().iterator(); while (i<XDtEjbValueObj:currentAggregateName/>.hasNext()) { <XDtEjbValueObj:currentAggregateType/> o = (<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next(); remove<XDtMethod:methodTagValue tagName="ejb:value-object" paramName="members-name"/>(o); } </XDtEjbValueObj:ifIsCollection> } </XDtEjbValueObj:forAllComposes> } catch (Exception e) { throw new javax.ejb.EJBException(e); } } </XDtEjbValueObj:forAllSuperSetValue> /* Value Objects END */ ------------------------------------------------------- This SF.Net email is sponsored by the JBoss Inc. Get Certified Today Register for a JBoss Training Course. Free Certification Exam for All Training Attendees Through End of 2005. For more info visit: http://ads.osdn.com/?ad_id=7628&alloc_id=16845&op=click _______________________________________________ xdoclet-devel mailing list xdoclet-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/xdoclet-devel