Did anybody else have this problem? Its really blocking my development right now?
-----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Behalf Of Fran�ois Eric Sent: March 25, 2003 12:05 PM To: Xdoclet Mailing List (E-mail) Subject: [Xdoclet-user] Value Objects for one to one CMR composition Hello, I have recently switched from data-objects to value-objects (great feature!). I have a problem though when trying to create a value-object for a one to one CMR composition. The value-object that is generated is ok but the CMP object that is generated isn't (in my opinion). My relation is: one Produit is composed of one TypeGroupeProduit. Here are the declarations for my value-objects: for the class: * @ejb.bean name="Produit" * view-type="both" * type="CMP" * jndi-name="client/Produit" * local-jndi-name="client/local/Produit" * * @ejb.value-object * name="Produit" * match="*" ... and for the method: /** * @ejb.value-object * compose="com.sage.client.persist.props.CodeBarreValue" * compose-name="CodeBarreValue" * members="com.sage.client.persist.interfaces.CodeBarreLocal" * members-name="CodeBarre" * relation="external" * * @ejb.relation name="produit-codeBarre" * role-name="one-produit-has-one-codeBarre" * target-ejb="CodeBarre" * target-role-name="one-codeBarre-belongs-to-one-produit" * target-cascade-delete="yes" * * @jboss.relation * fk-column="CODE_BARRE_ID" * related-pk-field="id"* * @ejb.interface-method view-type="local" */ public abstract CodeBarreLocal getCodeBarre(); /** * @ejb.interface-method view-type="local" */ public abstract void setCodeBarre(CodeBarreLocal cb); now if I do the following in my test code: ProduitValue voProd1 = new ProduitValue(); voProd1.setId(GUID4.toString()); voProd1.setNom(NOM_PROD1); voProd1.setVersion(VERSION1); CodeBarreValue voCB1 = new CodeBarreValue(); voCB1.setId(GUID7.toString()); voCB1.setOrigin(ORIGIN_CB1); ProduitRemote prod1 = produitHome.create(voProd1); voProd1.setCodeBarreValue(voCB1); prod1.setProduitValue(voProd1); Since it is a composition, I would expect the setProduitValue to create the CodeBarre object. Instead the method looks for an existing CodeBarre (findByPrimaryKey) therefore I receive an ObjectNotFoundException. In the case of a composition that is one to many, or many to many I don't have this problem. The set method will create the objects that it is composed of. It only seems to occur in a one-to-one composition. I would appreciate if someone could tell me if I am doing something wrong, if my interpretation is wrong or if this is a bug. Thank you very much, Fran�ois PS: Here is the code generated for the setProduitValue: public void setProduitValue( com.sage.client.persist.props.ProduitValue valueHolder ) { try { setNom( valueHolder.getNom() ); setVersion( valueHolder.getVersion() ); // Anonymous block to allow variable declations without conflicts { // Checks for null aggregate if (valueHolder.getCodeBarreValue() != null) { com.sage.client.persist.interfaces.CodeBarrePK pk = new com.sage.client.persist.interfaces.CodeBarrePK(valueHolder.getCodeBarreValue().getId()); com.sage.client.persist.interfaces.CodeBarreLocalHome home = com.sage.client.persist.util.CodeBarreUtil.getLocalHome(); com.sage.client.persist.interfaces.CodeBarreLocal relation = home.findByPrimaryKey(pk); relation.setCodeBarreValue(valueHolder.getCodeBarreValue()); } } } catch (Exception e) { throw new javax.ejb.EJBException(e); } } PS2: Here is the code I think should be generated for setProduitValue public void setProduitValue( com.sage.client.persist.props.ProduitValue valueHolder ) { try { setNom( valueHolder.getNom() ); setVersion( valueHolder.getVersion() ); // Anonymous block to allow variable declations without conflicts { // Checks for null aggregate if (valueHolder.getCodeBarreValue() != null) { com.sage.client.persist.interfaces.CodeBarreLocalHome home = com.sage.client.persist.util.CodeBarreUtil.getLocalHome(); com.sage.client.persist.interfaces.CodeBarreLocal relation = home.create(valueHolder.getCodeBarreValue()); setCodeBarre(relation); } } } catch (Exception e) { if(e instance of javax.ejb.CreateException) { throw (javax.ejb.CreateException) e; } else { throw new javax.ejb.EJBException(e); } }
<<winmail.dat>>
