Hi Troy,
I ran into this same issue. Containers actually create records for both entities and then follow up with a SQL "update" command that puts in the foreign keys that link the relationship. I believe this is because the primary keys may not be created until the first insert occurs (depending on the scheme your entities use for generating the PKs).
Because of this, your foreign-key columns MUST allow null values. Are you sure that your tables aren't defined with "not null" constraints on those columns?
james
Poppe, Troy wrote:
I based my code off the sample provided here:
http://www.xdoclet.org/valueobjects.html
Perhaps this wasn't the correct code to follow (I trusted it was because it was managed by the xdoclet group).
I am using XDoclet 1.2b2.
It seems to me that somewhere in the EJB side code, there needs to be a call that sets the relationship in terms of Local EJB references. I can't find code that does something like this in any of the templates for value-object code generation.
Please, any one, any ideas? I need to get this working.
Troy
-----Original Message----- From: Vikram Naik [mailto:[EMAIL PROTECTED] Sent: Thursday, June 05, 2003 10:36 AM To: [EMAIL PROTECTED] Subject: Re: [Xdoclet-user] Updating CMR field through VO?
Hello,
Which XDoclet version you are using .. because the version which i have(1.2 b) doesn't method level tag for ejb.valueobject !!
Regards, Vikram
----- Original Message ----- From: "Poppe, Troy" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Thursday, June 05, 2003 3:53 PM Subject: [Xdoclet-user] Updating CMR field through VO?
I have defined a bi-directional, one-to-many CMR in two EJBs(PerformancePlan and
AssignedPerformanceElement) as seen below. Each of these EJBs has anassociated
ValueObject. The PerformancePlanValue contains a Collection ofCollections
AssignedPerformanceElements, and there are a number of additional
that represent the AssignedPerformanceElements that have been added,updated, or
removed.wrappered
I have created my EJBs as having ONLY local interfaces, and thus I have
them with a Session bean that is responsible for managing the interactionswith
the client (a Struts application in this case). One of the methodsavailable to
the Struts application is seen below. It takes as a parameter, aninstance of a
PerformancePlanValue (presumably with some changes that need to beupdated, and
persisted). Of particular interest here is the adding, creating, orremoving of
AssignedPerformanceElements.place a
In my code that calls updatePerformancePlan(PerformancePlanValue ppv), I
new AssignedPerformanceElementValue object into the PerformancePlanValueobject
by callingaddAssignedPerformanceElement(gov.doe.eia.pms.AssignedPerformanceElementValu
e
added).dynamically
Unfortunately, when I get into the
add(gov.doe.eia.pms.AssignedPerformanceElementValue added) method in
PerformancePlanCMP, there's a section of code (seen below) that is
generated. No where in this section of code is there a call toa
setPerformancePlan(PerformancePlanLocal preformancePlan). This seems like
local place to add the reference to the parent object.AssignedPerformanceElement
When the EJB container attempts to persist the new
into the database, there's an execpted error:doing to
javax.ejb.CreateException: Could not create entity:java.sql.SQLException: ORA-01400: cannot insert NULL into ("HR"."ASSIGNEDPERFORMANCEELEMENT"."PERFORMANCEPLANID")
Is it my responsiblity as the EJB developer to do something that I'm not
ensure that my relationships are referenced properly when I useValueObjects? Am
I using the ValueObjects wrong? Is there something missing from XDoclet's dynamically generated code?
Thanks.
Troy Poppe
----
public class PerformancePlanBean { ... /** * @ejb.relation * name = "AssignedPerformanceElementsInAPerformancePlanRelation" * role-name = "AssignedPerformancePlanHasPerformanceElements" * cascade-delete = "no" * * @ejb.interface-method * view-type = "local" * * @ejb.value-object * compose="gov.doe.eia.pms.AssignedPerformanceElementValue" * compose-name="AssignedPerformanceElement" * members="gov.doe.eia.pms.AssignedPerformanceElementLocal" * member-name="AssignedPerformanceElement" * relation="external" * type="Collection" * * @return */ public abstract Collection getAssignedPerformanceElements();
/** * * @ejb.interface-method * view-type = "local" * * @param performanceElements */ public abstract void setAssignedPerformanceElements(Collection assignedPerformanceElements); ... }
public class AssignedPerformanceElementBean { ... /** * @ejb.relation * name = "AssignedPerformanceElementsInAPerformancePlanRelation" * role-name = "AssignedPerformanceElementInAPerformancePlan" * * @ejb.interface-method * view-type = "local" * * @jboss.relation * fk-column = "performancePlanID" * related-pk-field = "performancePlanID" * * @author TPO */ public abstract PerformancePlanLocal getPerformancePlan();
/** * @ejb.interface-method * view-type = "local" * * @jboss.relation * fk-column = "performancePlanID" * related-pk-field = "performancePlanID" * * @author TPO */ public abstract void setPerformancePlan(PerformancePlanLocal preformancePlan); ... }
public PerformancePlanValue updatePerformancePlan(PerformancePlanValue ppv) { PerformancePlanLocalHome pplHome = null; PerformancePlanLocal ppl = null;
try { pplHome = PerformancePlanUtil.getLocalHome(); } catch ( NamingException ex) { }
if ( ppv.getPerformancePlanID() == null ) { // new PerformancePlan // NOTE: should probably check if the user is in the right role // to be creating a performance plan. try { ppl = pplHome.create(ppv); } catch ( CreateException ex ) { } } else { // existing PerformancePlan try { ppl = pplHome.findByPrimaryKey(ppv.getPerformancePlanID()); ppl.setPerformancePlanValue(ppv); } catch ( FinderException ex ) { } } return ppl.getPerformancePlanValue(); }
public void add(gov.doe.eia.pms.AssignedPerformanceElementValue added) throws javax.ejb.CreateException { try { java.lang.Integer pk = added.getAssignedPerformanceElementID();
gov.doe.eia.pms.AssignedPerformanceElementLocalHome home = gov.doe.eia.pms.AssignedPerformanceElementUtil.getLocalHome();
gov.doe.eia.pms.AssignedPerformanceElementLocal relation = home.create(added); getAssignedPerformanceElements().add(relation); } catch (Exception e){ if (e instanceof javax.ejb.CreateException) throw (javax.ejb.CreateException)e; else throw new javax.ejb.EJBException(e); } }
------------------------------------------------------- This SF.net email is sponsored by: Etnus, makers of TotalView, The best thread debugger on the planet. Designed with thread debugging features you've never dreamed of, try TotalView 6 free at www.etnus.com. _______________________________________________ xdoclet-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/xdoclet-user
------------------------------------------------------- This SF.net email is sponsored by: Etnus, makers of TotalView, The best thread debugger on the planet. Designed with thread debugging features you've never dreamed of, try TotalView 6 free at www.etnus.com. _______________________________________________ xdoclet-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/xdoclet-user
-------------------------------------------------------
This SF.net email is sponsored by: Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
xdoclet-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-user
------------------------------------------------------- This SF.net email is sponsored by: Etnus, makers of TotalView, The best thread debugger on the planet. Designed with thread debugging features you've never dreamed of, try TotalView 6 free at www.etnus.com. _______________________________________________ xdoclet-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/xdoclet-user
