By Chris Muir on Dec 20, 2012
ADF Business Components support the ability to publish the underlying Application Modules (AMs) and View Objects (VOs) as web services through Service Data Objects (SDOs). This blog post looks at a minor challenge to overcome when using SDOs and Entity Objects (EOs) that use a composition association.
Using the default ADF BC EO association behaviour
ADF BC components allow you to work with VOs that are based on EOs that are a part of a parent-child composition association. A composition association enforces that you cannot create records for the child outside the context of the parent. As example when creating invoice-lines you want to enforce the individual lines have a relating parent invoice record, it just simply doesn't make sense to save invoice-lines without their parent invoice record.
In the following screenshot using the ADF BC Tester it demonstrates the correct way to create a child Employees record as part of a composition association with Departments:
And the following screenshot shows you the wrong way to create an Employee record:
Note the error which is enforced by the composition association:
(oracle.jbo.InvalidOwnerException) JBO-25030: Detail entity Employees with row key null cannot find or invalidate its owning entity.
Working with composition associations via the SDO web services
Shay Shmeltzer recently recorded a good video which demonstrates how to expose your ADF Business Components through the SDO interface.
On exposing the VOs you get a choice of operation to publish including create, update, delete and more:
For example through the SDO test interface we can see that the create operation will request the attributes for the VO exposed, in this case EmployeesView1:
In this specific case though, just like the ADF BC Tester, an attempt to create this record will fail with JBO-25030, the composition association is still enforced:
The correct way to to do this is through the create operation on the DepartmentsView1 which also lets you create employees record in context of the parent, thus satisfying the composition association rule:
Yet at issue here is the create operation will always create both the parent Departments and Employees records. What do we do if we've already previously created the parent Departments records, and we just want to create additional Employees records for that Department? The create method of the EmployeeView1 as we saw previously doesn't allow us to do that, the JBO-3050 error will be raised.
The solution is the "merge" operation on the parent Departments record:
In this case for the Departments record you just need to supply the DepartmentId of the Department you want the Employees record to be associated with, as well as the new Employees record. When invoked only the Employees record is created, and the supply of the DepartmentId of the Departments record satisfies the composition association without actually creating or updating the associated Department record that already exists in the database.
Be warned however if you supply any more attributes for the Department record, it will result in a merge (update) of the associated Departments record too.