Ivan Lucas Vargas created OLINGO-574:
----------------------------------------

             Summary: Batch request inserting master/detail entities not working
                 Key: OLINGO-574
                 URL: https://issues.apache.org/jira/browse/OLINGO-574
             Project: Olingo
          Issue Type: Bug
          Components: odata2-jpa
    Affects Versions: V2 2.0.1
         Environment: JPA (Hibernate), MacOS, tomcat 7, Oracle 12c database
            Reporter: Ivan Lucas Vargas


According to the OData specification, we can relate post requests for inserting 
entities in the same batch request: 
http://www.odata.org/documentation/odata-version-2-0/batch-processing (item 
2.2.1 - Referencing requests in a changeset)

Olingo should understand the master / detail relationship as per metadata 
navigation properties and:
1. Insert the master entity and get the sequence Id of it (as per JPA mapping)
2. Before inserting the details entities, it should update this entities by 
setting the master id into the details entities, and then persist to respect 
the fk relationship

When sending the request, Olingo does not understand this relationship and does 
not update the details entities with the Id of the master entity.

Details:
I'm trying to insert one entity with a list of another entity in the same batch 
request. In my case, the post payload is:

--batch_98b2-5d17-73e4
Content-Type: multipart/mixed; boundary=changeset_3d94-0d7a-375d

--changeset_3d94-0d7a-375d
Content-Type: application/http
Content-Transfer-Encoding: binary

POST Orders HTTP/1.1
Content-ID: 1
DataServiceVersion: 2.0
Accept: application/atomsvc+xml;q=0.8, 
application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, */*;q=0.1
Content-Type: application/json
MaxDataServiceVersion: 3.0

{"OrderId":-1,"Customer":1}
--changeset_3d94-0d7a-375d
Content-Type: application/http
Content-Transfer-Encoding: binary

POST OrderItems HTTP/1.1
Content-ID: 2
DataServiceVersion: 2.0
Accept: application/atomsvc+xml;q=0.8, 
application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, */*;q=0.1
Content-Type: application/json
MaxDataServiceVersion: 3.0

{"OrdemItemId":-2,"OrderId":-1,"ProductId":132}
--changeset_3d94-0d7a-375d--

--batch_98b2-5d17-73e4--

The idea here is to insert both entities. So, we have the OrderId: -1 and 
OrderItemId: -2. This way, olingo will understand and generate the ids based on 
the Oracle sequence mapped into the JPA entities. But, as far as I read till 
now, the second changeset should reference the first changeset, by using the $ 
in the POST. So, it should be:

POST OrderItems HTTP/1.1 (original) -> POST $1/OrderItems HTTP/1.1 (by 
referencing the content-id: 1 of the first changeset)

Is this understanding correct? If yes, the second question is: My payload needs 
to have the navigation link included? In this case, the payload sould be 
something like:

{"OrdemItemId":-2,"OrderId":-1,"ProductId":132} (original) -> 
{"OrdemItemId":-2,"OrderId":-1,"ProductId":132, OrderDetails: {url: __deferred}}

Is this understand also correct? Or by the navigation link olingo will 
understand that in the entity OrderItem, the property OrderId is a property 
link and will resolve this referenced request and will fill the attribute 
OrderItem.OrderId with the Order.OrderId that was already updated with the 
sequence value got from the entity resolution of the first changeset?

The navigation property for this relationship generated by the $metadata is:
<NavigationProperty Name="OrderDetails" Relationship="pu.Order_OrderItem" 
FromRole="OrderItem" ToRole="Order"/>



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to