[ 
https://issues.apache.org/jira/browse/OLINGO-1522?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vladislav Babin updated OLINGO-1522:
------------------------------------
    Description: 
I have a classic setup of users, roles and user_roles table. Users are defined 
as follows:

 
{code:java}
@Entity
@Table(name = "users")
public class User implements Serializable {
...
    @Getter
    @Setter
    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"),
        uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", 
"role_id"})}
    )
Role.class)
    private List<Role> roles;
...
}{code}
The problem is when I execute PATCH (PUT, MERGE) on Users endpoint
{code:java}
PATCH http://localhost:8080/admin/rest/odata/Users(7)

{
   "RoleDetails":[
      {
         "__metadata":{
            "id":"http://localhost:8080/admin/rest/Roles(3L)",
            "uri":"http://localhost:8080/admin/rest/Roles(3L)",
            "type":"default.Role"
         },
         "Code":"ROLE8",
         "Id":"3",
         "Name":"Role 8"
      }
   ]
}
{code}
 and the user has a role from the RoleDetails list then I get an error that 
results from PostgreSQL's
{code:java}
ERROR: duplicate key value violates unique constraint "pk_user_roles"
{code}
At the same time when I update as user with plain JPA repository it succeeds:
{code:java}
    @PUT
    @Path("/{id}")
    @Produces("application/json")
    public User put(@Context SecurityContext securityContext, @PathParam("id") 
Long id, User user){
        return userRepository.saveAndFlush(user);
    }
{code}
Adding @EdmNavigationProperty to roles field did not help:
{code:java}
    @Getter
    @Setter
    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    @EdmNavigationProperty(toMultiplicity = Multiplicity.MANY, toType = 
Role.class)
    private List<Role> roles;
{code}
OData app uses Spring Boot entity manager as proposed in this tutorial: 
[https://www.baeldung.com/odata]

The question is: shoudn't olingo check for existing records in a join table?  
how can I further investigate the issue? Any working example of olingo2 + JPA + 
@JoinTable would be highly appreciated.

 

 

  was:
I have a classic setup of users, roles and user_roles table. Users are defined 
as follows:

 
{code:java}
@Entity
@Table(name = "users")
public class User implements Serializable {
...
    @Getter
    @Setter
    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"),
        uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", 
"role_id"})}
    )
Role.class)
    private List<Role> roles;
...
}{code}
The problem is when I execute PATCH (PUT, MERGE) on Users endpoint

 

 
{code:java}
PATCH http://localhost:8080/admin/rest/odata/Users(7)

{
   "RoleDetails":[
      {
         "__metadata":{
            "id":"http://localhost:8080/admin/rest/Roles(3L)",
            "uri":"http://localhost:8080/admin/rest/Roles(3L)",
            "type":"default.Role"
         },
         "Code":"ROLE8",
         "Id":"3",
         "Name":"Role 8"
      }
   ]
}
{code}
 

and the user already has the role then I get an error that roots to PostgreSQL's
{code:java}
ERROR: duplicate key value violates unique constraint "pk_user_roles"
{code}
At the same time when I run update with plain JPA repository it succeeds:
{code:java}
    @PUT
    @Path("/{id}")
    @Produces("application/json")
    public User put(@Context SecurityContext securityContext, @PathParam("id") 
Long id, User user){
        return userRepository.saveAndFlush(user);
    }
{code}
Adding @EdmNavigationProperty annotation did not help:
{code:java}
    @Getter
    @Setter
    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    @EdmNavigationProperty(toMultiplicity = Multiplicity.MANY, toType = 
Role.class)
    private List<Role> roles;
{code}
OData app uses Spring Boot entity manager as in this tutorial: 
https://www.baeldung.com/odata

The question is: shoudn't olingo check for existing records in a join table?  
how can I further investigate the issue? Any working example of olingo2 + JPA + 
@JoinTable would be highly appreciated.

 

 


> @JoinTable links are not updated correctly
> ------------------------------------------
>
>                 Key: OLINGO-1522
>                 URL: https://issues.apache.org/jira/browse/OLINGO-1522
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata2-jpa
>    Affects Versions: V2 2.0.11
>            Reporter: Vladislav Babin
>            Priority: Major
>
> I have a classic setup of users, roles and user_roles table. Users are 
> defined as follows:
>  
> {code:java}
> @Entity
> @Table(name = "users")
> public class User implements Serializable {
> ...
>     @Getter
>     @Setter
>     @ManyToMany(cascade = {CascadeType.ALL})
>     @JoinTable(name = "user_roles",
>         joinColumns = @JoinColumn(name = "user_id"),
>         inverseJoinColumns = @JoinColumn(name = "role_id"),
>         uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", 
> "role_id"})}
>     )
> Role.class)
>     private List<Role> roles;
> ...
> }{code}
> The problem is when I execute PATCH (PUT, MERGE) on Users endpoint
> {code:java}
> PATCH http://localhost:8080/admin/rest/odata/Users(7)
> {
>    "RoleDetails":[
>       {
>          "__metadata":{
>             "id":"http://localhost:8080/admin/rest/Roles(3L)",
>             "uri":"http://localhost:8080/admin/rest/Roles(3L)",
>             "type":"default.Role"
>          },
>          "Code":"ROLE8",
>          "Id":"3",
>          "Name":"Role 8"
>       }
>    ]
> }
> {code}
>  and the user has a role from the RoleDetails list then I get an error that 
> results from PostgreSQL's
> {code:java}
> ERROR: duplicate key value violates unique constraint "pk_user_roles"
> {code}
> At the same time when I update as user with plain JPA repository it succeeds:
> {code:java}
>     @PUT
>     @Path("/{id}")
>     @Produces("application/json")
>     public User put(@Context SecurityContext securityContext, 
> @PathParam("id") Long id, User user){
>         return userRepository.saveAndFlush(user);
>     }
> {code}
> Adding @EdmNavigationProperty to roles field did not help:
> {code:java}
>     @Getter
>     @Setter
>     @ManyToMany(cascade = {CascadeType.ALL})
>     @JoinTable(name = "user_roles",
>         joinColumns = @JoinColumn(name = "user_id"),
>         inverseJoinColumns = @JoinColumn(name = "role_id")
>     )
>     @EdmNavigationProperty(toMultiplicity = Multiplicity.MANY, toType = 
> Role.class)
>     private List<Role> roles;
> {code}
> OData app uses Spring Boot entity manager as proposed in this tutorial: 
> [https://www.baeldung.com/odata]
> The question is: shoudn't olingo check for existing records in a join table?  
> how can I further investigate the issue? Any working example of olingo2 + JPA 
> + @JoinTable would be highly appreciated.
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to