1) in the crm sample application, change the fill line in the
companyChange function to read:
dsEmployee.fill(employees, company) //change from companyId
int to company VO

2) in the crm sample application, addEmployee function,
replace this line:
employees.addItem(employee);
with this:
dsEmployee.createItem(employee);
(you don't have to do this if you keep 2 instances of the app
running)

3) in the crm.samples.EmployeeAssembler fill method, change
the fill by commenting out everything after the line that says
return dao.GetEmployees(); and replace them with these lines:
Company cp = (Company) fillParameters.get(0);
return dao.findEmployeesByCompany(cp.getCompanyId());

4) in the crm.samples.EmployeeAssembler createItem method,
replace the second dtx.refreshFill with the following line:
dtx.refreshFill("crm.employee", Arrays.asList( new Object[]
{newEmployee.getCompany()}));

It appears that even though the DataService accepts Value
Objects as parameters for a fill command, it does not recognize
anyone as a valid subscriber for refreshes triggered by
createItem(). I turned on logging to Debug and get this:
Refresh Fill: destination=crm.employee
fillParameters=[samples.crm.Company] matched no sequence currently
managed on clients.
I get this even though I only have one client running and
that exact fill is the only one that should be active:

Just as a side note I've tried:
Having Company Implement Comparable.
Having Company with its own equals() which always returns
true;
Having Company with its own ToString() which I have coded to
output to console when it's accessed proving DataService does in
fact make the mapping correctly at some point.
Removing the dtx stuff and using the default refreshFill()
methods.
Observing the messages returned to the client.
Observing the lack of messages returned to a second client
viewing the same set of employees when i add new record.
Confimed that updateItem and DeleteItem work fine regardless.