2

I've come to a problem, where i have to a user which can be registered in multiple companies. Those companies can have registered multiple products. And user should be aware to which products in which companies he has rights.

This is my solution so far, but it does not return the roles correctly:

class User {
  @Id
  @Column(name = "USER_ID")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "USERNAME", unique = true)
  private String username;

  @Column(name = "PASSWORD")
  private String password;

  @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  @JoinTable(name = "USER_ROLES",
        joinColumns = {@JoinColumn(name = "USER_ID"), @JoinColumn(name = "COMPANY_ID"), @JoinColumn(name="PRODUCT_ID")},
        inverseJoinColumns = {@JoinColumn(name = "ROLE_ID"), @JoinColumn(name = "COMPANY_ID"), @JoinColumn(name="PRODUCT_ID")})
  private Set<Role> roles = new HashSet<>();

  @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  @JoinTable(name = "USER_COMPANIES",
        joinColumns = {@JoinColumn(name = "USER_ID")},
        inverseJoinColumns = {@JoinColumn(name = "COMPANY_ID")})
  private Set<Company> companies = new HashSet<>();
}

class Role {
  @Id
  @Column(name = "ROLE_ID")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "ROLE_NAME")
  @Enumerated(EnumType.STRING)
  @NaturalId
  private RoleName role;

  @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
  @JsonIgnore
  private Set<User> userList = new HashSet<>();
}

class Company {
  @Id
  @Column(name = "COMPANY_ID")
  private Long id;

  @ManyToMany(mappedBy = "companies", fetch = FetchType.LAZY)
  @JsonIgnore
  private Set<User> userList = new HashSet<>();

  @OneToMany(mappedBy = "company")
  private Set<Product> products;
}

class Product {
  @Id
  @Column(name = "COMPANY_ID")
  private Long id;

  @ManyToOne
  @JoinColumn(name="COMPANY_ID", nullable=false)
  private Company company;

  private ProductType productType;

}

My ultimate goal is to get roles from user, could anyone help, please? Thanks a lot in advance!

  • @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable(name = "USER_ROLES", joinColumns = {@JoinColumn(name = "USER_ID"), @JoinColumn(name = "COMPANY_ID"), @JoinColumn(name="PRODUCT_ID")}, inverseJoinColumns = {@JoinColumn(name = "ROLE_ID"), @JoinColumn(name = "COMPANY_ID"), @JoinColumn(name="PRODUCT_ID")}) **@JsonBackReference** private Set roles = new HashSet<>(); try with JsonBackReference in user pojo – Mr code. Dec 05 '18 at 12:34
  • @Mrcode. why don't you post this as the answer? – Simon Martinelli Dec 05 '18 at 13:16
  • Personally, I recommend using CQRS, or some dedicated view in this case. – M314 Dec 05 '18 at 13:17
  • @Simon Martinelli, now I will do:) – Mr code. Dec 06 '18 at 04:43

1 Answers1

1
     @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
     @JoinTable(name = "USER_ROLES", joinColumns = {@JoinColumn(name = "USER_ID"), 
     @JoinColumn(name = "COMPANY_ID"), @JoinColumn(name="PRODUCT_ID")}, inverseJoinColumns = 
    {@JoinColumn(name = "ROLE_ID"), @JoinColumn(name = "COMPANY_ID"), 
     @JoinColumn(name="PRODUCT_ID")}) 
     ***@JsonBackReference***
     private Set<Role> roles = new HashSet<>();

try with @JsonBackReference in user pojo.@JsonBackReference will set roles to user in the deserialization process.

Mr code.
  • 307
  • 2
  • 17