[ https://issues.apache.org/jira/browse/OLINGO-1387?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
mibo updated OLINGO-1387: ------------------------- Fix Version/s: V2 2.0.13 (was: V2 2.0.12) > olingo-odata2-annotation-processor: support multiple links between the same > entity sets > --------------------------------------------------------------------------------------- > > Key: OLINGO-1387 > URL: https://issues.apache.org/jira/browse/OLINGO-1387 > Project: Olingo > Issue Type: Bug > Components: odata2-annotation > Reporter: Carsten Milkau > Priority: Major > Labels: patch > Fix For: V2 2.1.0, V2 2.0.13 > > Attachments: Car.java, Driver.java, > odata2-annotation-processor-multiple-links-rc1.patch > > Original Estimate: 24h > Remaining Estimate: 24h > > When multiple links (associations) exist between the same two entity sets, > the annotation processor does not distinguish between them, even if you name > the associations explicitly. The EDM provider binds the same association > (whatever it finds first) to all navigation properties between this pair of > entity sets, reading and writing relations/links produces the same data for > each navigation property, even if they should use different associations. > *Steps to reproduce:* > # Checkout cars-annotation-archetype > # Add property "previousDrivers" to entity type Car (see Car.java) > # Add property "previousCars" to entity type Driver (see Driver.java) > # Optional: explicitly name association for properties "Car.Driver" and > "Driver.Car" > # Run example service > # Retrieve EDMX metadata > *Expected results:* > Properties "previousDrivers" and "previousCars" use association > "Car_previousDrivers_2_Driver_previousCars": > > {color:#0000ff}<{color}{color:#800000}EntityType{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car">{color} > {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}PropertyRef{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Model"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Price"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Double"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"ModelYear"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int32"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Updated"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Manufacturer"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.r_Cars_2_r_Manufacturer"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Cars"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Manufacturer"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousDrivers"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_previousDrivers_2_Driver_previousCars"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousCars"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousDrivers"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}EntityType{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver">{color} > {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}PropertyRef{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int64"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Name"{color} > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Lastname"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Nickname"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Birthday"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car"{color} > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousCars"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_previousDrivers_2_Driver_previousCars"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousDrivers"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousCars"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color} > *Actual results:* > Properties "previousDrivers" and "previousCars" use association > "Car_currentDriver_2_Driver_currentCar": > > {color:#0000ff}<{color}{color:#800000}EntityType{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car">{color} > {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}PropertyRef{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Model"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Price"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Double"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"ModelYear"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int32"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Updated"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Manufacturer"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.r_Cars_2_r_Manufacturer"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Cars"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Manufacturer"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousDrivers"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}EntityType{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver">{color} > {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}PropertyRef{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int64"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Name"{color} > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Lastname"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Nickname"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}Property{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Birthday"{color} > > {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color} > > {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car"{color} > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} > {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousCars"{color} > > {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color} > > {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color} > > {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}{color:#800000}/{color}{color:#0000ff}>{color} > {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color} > *Workaround:* > # Only workaround is to change your model. You could promote the > associations to entity types only consisting of navigation properties, for > instance. > *Additional information:* > # Interface Datasource lacks a means of communicating the link followed when > reading or writing related data. Only the target entity set can be > communicated. The fix must change this. > # The patch currently just adds an optional parameter to the relevant > interface methods passing the navigation property. When the parameter is not > passed, the navigation property is guessed as before. This breaks > applications that directly use the interface, but only those. > # Obviously, there is no point in both changing the interface and keeping > the old guessing behavior. But which of both is the correct choice? > ## (Incompatible change) Change the relevant interface methods and pass the > necessary navigation property. > ## (Compatible change) Make an extension interface with new methods that > additionally pass the navigation property and detect whether the extension > interface is supported by the Datasource implementation. > ## Other: ___________________________ > -- This message was sent by Atlassian Jira (v8.20.7#820007)