Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/Development/Dynamic/RefactorPhaseIForSparseMerge"

(Current status)
Line 42: Line 42:
 
Note the use of <code>xsi:nil</code> to indicate <code>null</code> for our Dog walker's department.
 
Note the use of <code>xsi:nil</code> to indicate <code>null</code> for our Dog walker's department.
  
=== <code>isSet</code> and <code>DynamicEntity</code> ===
+
=== <code>DynamicEntity</code> Refactor (Phase I) ===
One solution to the above problem is to have a way to tell the difference between a field that has not yet been assigned any value vs. <code>null</code>.
+
The <code>DynamicEntity</code> interface allows one to tell the difference between 'the value was never set' and 'the value is currently <code>null</code>' using <code>public boolean isSet(String propertyName)</code>
<source lang="java5">
+
import org.eclipse.persistence.exceptions.DynamicException;
+
 
+
public interface IsSetable {
+
 
+
    public boolean isSet(String propertyName) throws DynamicException;
+
}
+
</source>
+
It is helpful to note that the above interface is a subset of the <code>DynamicEntity</code> interface:
+
<source lang="java5">
+
//EclipseLink imports
+
import org.eclipse.persistence.exceptions.DynamicException;
+
 
+
public interface DynamicEntity {
+
 
+
    public <T> T get(String propertyName) throws DynamicException;
+
 
+
    public DynamicEntity set(String propertyName, Object value) throws DynamicException;
+
 
+
    public boolean isSet(String propertyName) throws DynamicException;
+
}
+
</source>
+
Thus, support for Sparse Merge will initially be done through <code>DynamicEntity</code>'s
+
 
+
==== Changes to <code>DynamicEntity</code> ====
+
The current EclipseLink <code>DynamicEntity</code> implementation (as of 10/02/18) sets default values for all fields, which defeats the ability of a merge algorithm to support 'sparse-ness'. Setting default values must be moved out of the 'core' Dynamic Persistence framework and relocated to a Dynamic 'helper' class such as DynamicTypeBuilder or JPADynamicTypeBuilder
+

Revision as of 14:46, 18 March 2010


Sparse Merge

Current status

The current DBWS implementation (as of 10/02/18) does not handle SOAP update messages that contain changed-only information. The Update operation (part of CRUD lifecycle) requires 'theInstance' to be fully specified in the SOAPMessage; it would be useful to support an update where - excluding PK fields - only the changed elements are specified

For example, Employee 1111 is assigned a new job 'Dog walker':

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header/>
  <env:Body>
    <srvc:update_empType xmlns:srvc="urn:empService" xmlns:ns1="urn:emp">    
      <srvc:theInstance>
        <ns1:empType>
          <ns1:empno>1111</ns1:empno>   <- primary key
          <ns1:job>Dog walker</ns1:job> <- updated job title
        </ns1:empType>    
      </srvc:theInstance>
    </srvc:update_empType>
  </env:Body>
</env:Envelope>

If this representation of Employee 1111 were to be marshalled into an object, most fields (ename, mgr, etc.) will contain null. Any attempt to merge this with a version retreived from the database would *over-write* committed data with nulls. Because of this, the complete instance must be specified:

<srvc:theInstance>
  <ns1:empType>
    <ns1:empno>1111</ns1:empno>   <- primary key
    <ns1:ename>NORMAN</ns1:ename>
    <ns1:job>Dog walker</ns1:job>   <- only field that changed
    <ns1:mgr>7698</ns1:mgr>
    <ns1:hiredate>1998-09-08T00:00:00.0</ns1:hiredate>
    <ns1:sal>10</ns1:sal>
    <ns1:comm>0.1</ns1:comm>
    <ns1:deptno xsi:nil="true"/>
  </ns1:empType>    
</srvc:theInstance>

Note the use of xsi:nil to indicate null for our Dog walker's department.

DynamicEntity Refactor (Phase I)

The DynamicEntity interface allows one to tell the difference between 'the value was never set' and 'the value is currently null' using public boolean isSet(String propertyName)

Back to the top