I have problem understanding how to connect 3 tables with spring-boot / hibernate. Tables are: Users, Technologies, Categories
Every user has all of the 10 categories but inside this categories they can save one or more technologies. Each technology can be listed in several different categories.
I have a code that works partially as for now instead referencing the table category, I am just creating new category so I have duplicates in my BDD. Ideally I would love to have for each user data structure that like something like this (in pseudo-code):
{ { "category1" : {id, name} "technologies" [{id, name}, {id, name}, {id, name} ] }, { "category2" : {id, name} "technologies } . . . }
my tables are:
USER TABLE
public class MyUser { // other properties @OneToMany(mappedBy="id") private Collection<Category> categories; }
TECHNOLOGY
public class Technology { // other properties @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; @Column(name = "name") private String name; }
TECHNOLOGY CATEGORY:
public class TechnologyCategory { // other properties @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; @Column(name="name") private String name; }
and the table where I am trying to connect users with categories (from which each one has list of technologies)
USER_CATEGORIES
public class UserCategory { @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; @Column(name = "name") private String technologyCategory; // here I would love to reference technology category table @ManyToMany() Collection <Technology> technologies; }
so for I have tried/read this: Joining three tables using MySQL
ManyToManyToMany – Joining three tables with Hibernate annotations
Hibernate: How to Join three 3 tables in one join table in Annotation?
but with no success as every try to implement solutions above resulted in exceptions (all connected with hibernate unable to create tables) that I couldn’t resolve. Thank you
Advertisement
Answer
If I understoond correctly, something like this would work for you, assumed your example code works:
User class, which joins the categories:
public class User { @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; // other properties @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "user_categories", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "category_id", referencedColumnName = "id")) private Set<Category> categories; }
Category entity, which contains the technology’s category, and the technologies:
public class Category { @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; // other properties @ManyToOne @JoinColumn(name = "technology_category_id") private TechnologyCategory category; @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "category_technologies", joinColumns = @JoinColumn(name = "category_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "technology_id", referencedColumnName = "id")) private Set<Technology> technologies; }
TechnologyCategory entity:
public class TechnologyCategory { // other properties @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; @Column(name="name") private String name; }
Technology entity:
public class Technology { // other properties @Id @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") private int id; @Column(name="name") private String name; }
If you don’t want the ids to show up in your JSON, just put @JsonIgnore annotation above the id property.