On 14/06/2005 12:42 PM, Matt Hogstrom wrote:

I have a typical bean sequence where there is an Order and a number of Order 
Lines.  (1 ... many)  The OrderEnt is created from a Session bean 
coincidentally named OrderSes.  The OrderEnt then in ejbPostCreate creates the 
appropriate OrderLines.  Here is the code from OrderEnt:

public void ejbPostCreate(OrderDataBean odb, boolean deferred) throws CreateException {
<snip>

Depending on the situation one of the above orderLineHome.create methods is 
invoked.  So far, so good.

In the OrderLineEnt.create method things go a bit wrong. Here is the stack 
trace:

Caused by: javax.ejb.EJBException: cmp-field [orderId] is read-only.
       at 
org.tranql.ejb.ReadOnlyCMPFieldAccessor.set(ReadOnlyCMPFieldAccessor.java:44)
       at org.openejb.entity.cmp.CMPSetter.invokeInstance(CMPSetter.java:74)
       at 
org.openejb.entity.cmp.CMPMethodInterceptor.intercept(CMPMethodInterceptor.java:75)
Based on this stack-trace, I confirm that the CMP field orderId is mapped to a foreign key.

Here is the ejbCreate method that is failing

public OrderLineEntPK ejbCreate(int id, Integer orderId, String itemId, int quantity, BigDecimal totalValue, int olineStatus, java.sql.Date shipDate, BigDecimal msrp) throws CreateException {

       if( debugging )
           debug.println(3, "ejbCreate of ol_id = " + id + ", o_id = "
                         + orderId);

       setId(id);
       setOrderId(orderId);                          <==================== This 
is the line that is failing.
       setItemId(itemId);
       setQuantity(quantity);
       setTotalValue(totalValue.setScale(2, BigDecimal.ROUND_UP));
       setOlineStatus(olineStatus);



OrderId is the FK to the Order.
Fields mapped to foreign key columns are read-only. They are read-only for the following reason:
Let's assume that:
* we have one existing line item lineItemEntity;
* lineItemEntity is already related to an order orderEntity;
* orderEntity is related to two line items, lineItemEntity (as expected) and lineItemEntity2;
* we want to relate lineItemEntity to a new order orderEntity2;
* orderEntity2 is related to zero line items; and
* line item defines a CMR field order to set its related order.

In this specific scenario, if we set the CMR field order of lineItemEntity to orderEntity2, then:
* orderEntity2 is now related to the line item lineItemEntity; and
* orderEntity is now related to only one line item lineItemEntity2.

In this same scenario, if we set the CMP field orderId of lineItemEntity to the primary key of orderEntity2, then I am not sure of what the result should be. Indeed, it is a CMP field and no specfic semantic is attached to it.

To some extent, I am not sure that we should allow developers to update relationships via a direct update to the underlying foreign key columns. We could implement a fix to have a CMR semantic for CMP fields mapped to foreign ley columns; yet it does not sound good. Having said that, I do not have a strong opinion and I am happy to support such a scenario, if we need to.

Also, it is worth to notice that such a potential fix will only be able to handle CMP having simple primary keys. CMP having compound primary keys will still have a read-only approach.

First question is the deployment right for this scenario?  If it is, then I 
think that the container is not acting correctly.  This code runs on WebLogic, 
Sun One, WebSphere, etc.
Do you know if they properly support such scenarii (the CMP field must have a CMR semantic)? Also, do you know if they do not allow such scenarii in the case of compound PK CMP?

Thanks,
Gianny

Cheers,

- Matt



Reply via email to