In this tutorial we will learn about how many to many works and what it does.
Many to many represents two entities that can have multiple instances on the other. For example here a user can have many roles(user,manager,admin,etc) and a role can have many users.
Note that one entity can have a many-to-many relationship with itself. A many-to-many relationship does not have to be with two separate entities. For example, a child can have two parents and a parent can have many children.
We now have to choose the parent and the child sides. In our
One the parent side we have a Set of roles annotated with the @ManyToMany annotation. We also use the @JoinTable annotation to
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) @JoinTable( name = "user_roles", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) private Set<Role> roles;
package com.lovemesomecoding.user; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.lovemesomecoding.address.Address; import com.lovemesomecoding.laptop.Laptop; import com.lovemesomecoding.order.Order; import com.lovemesomecoding.role.Role; @JsonInclude(value = Include.NON_NULL) @Entity @Table(name = "user") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false, updatable = false, unique = true) private Long id; @Column(name = "uid", unique = true, nullable=false, updatable=false) private String uid; @Column(name = "name") private String name; @Column(name = "email") private String email; @Column(name = "age") private int age; @JsonIgnoreProperties(value= {"users"}) @ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) @JoinTable( name = "user_roles", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) private Set<Role> roles; public User() { super(); // TODO Auto-generated constructor stub } // setters and getters
On the child side of the relationship, we use the @ManyToMany annotation and also the mappedBy attribute.
@ManyToMany(mappedBy="roles", fetch=FetchType.EAGER) private Set<User> users;
package com.lovemesomecoding.role; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.lovemesomecoding.user.User; @JsonInclude(value = Include.NON_NULL) @Entity @Table(name = "role") public class Role implements Serializable { private static final long serialVersionUID = 1L; public static final String USER = "USER"; public static final String ADMIN = "ADMIN"; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false, updatable = false, unique = true) private Long id; @Column(name = "authority") private String authority; @ManyToMany(mappedBy="roles", fetch=FetchType.EAGER) private Set<User> users; public Role() { super(); // TODO Auto-generated constructor stub } // setters and getters
Many-To-Many with a more complex associative table.