A ​​ManyToMany​​​ relationship in Java is where the source object has an attribute that stores a collection of target objects and (if) those target objects had the inverse relationship back to the source object it would also be a ​​ManyToMany​​relationship. All relationships in Java and JPA are unidirectional, in that if a source object references a target object there is no guarantee that the target object also has a relationship to the source object. This is different than a relational database, in which relationships are defined through foreign keys and querying such that the inverse query always exists.

JPA also defines a ​​OneToMany​​​ relationship, which is similar to a ​​ManyToMany​​​ relationship except that the inverse relationship (if it were defined) is a ​​ManyToOne​​​ relationship. The main difference between a ​​OneToMany​​​ and a ​​ManyToMany​​​relationship in JPA is that a ​​ManyToMany​​​ always makes use of a intermediate relational join table to store the relationship, where as a ​​OneToMany​​ can either use a join table, or a foreign key in target object's table referencing the source object table's primary key.

In JPA a ​​ManyToMany​​​ relationship is defined through the ​​@ManyToMany​​​ annotation or the ​​<many-to-many>​​ element.

All ​​ManyToMany​​​ relationships require a ​​JoinTable​​​. The ​​JoinTable​​​ is defined using the ​​@JoinTable​​​ annotation and ​​<join-table>​​​ XML element. The ​​JoinTable​​​ defines a foreign key to the source object's primary key (​​joinColumns​​​), and a foreign key to the target object's primary key (​​inverseJoinColumns​​​). Normally the primary key of the ​​JoinTable​​ is the combination of both foreign keys.

Example of a ManyToMany relationship database[​​edit​​]

EMPLOYEE (table)

ID

FIRSTNAME

LASTNAME

1

Bob

Way

2

Sarah

Smith

EMP_PROJ (table)

EMP_ID

PROJ_ID

1

1

1

2

2

1

PROJECT (table)

ID

NAME

1

GIS

2

SIG

Example of a ManyToMany relationship annotation[​​edit​​]

@Entity
public class Employee {
@Id
@Column(name="ID")
private long id;
...
@ManyToMany
@JoinTable(
name="EMP_PROJ",
joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="ID"))
private List<Project> projects;
.....
}

Example of a ManyToMany relationship XML[​​edit​​]

<entity name="Employee" class="org.acme.Employee" access="FIELD">
<attributes>
<id name="id">
<column name="EMP_ID"/>
</id>
<set name="projects" table="EMP_PROJ" lazy="true" cascade="none" sort="natural" optimistic-lock="false">
<key column="EMP_ID" not-null="true" />
<many-to-many class="com.flipswap.domain.Project" column="PROJ_ID" />
</set>
</attributes>
</entity>

​https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany​