I have created @ManyToMany relationship between two entities Level and Area. I'm quite new with JPA but my understanding is that I don't need to create a entity model for link table but JPA should take care of it.
When reading the documentation this should be quite trivial to achieve. What I am missing here?
Level
@Entity
@Table(name = "Level", schema = "demo")
public class Level {
private Long id;
private String name;
private Collection<Area> areas;
public Level() {
areas = new ArrayList<Area>();
}
public Level(Long id, String name) {
this.id = id;
this.name = name;
}
@Id
@Column(name = "Id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(joinColumns={@JoinColumn(name="areaId")}, inverseJoinColumns={@JoinColumn(name="levelId")})
public Collection<Area> getAreas() {
return areas;
}
public void setAreas(Collection<Area> areas) {
this.areas = areas;
}
public void addArea(Area area) {
if (areas.contains(area)) {
areas.add(area);
}
}
}
Area
@Entity
@Table(name = "Area", schema = "demo")
public class Area {
private Long id;
private String name;
private Collection<Level> levels;
@ManyToMany(mappedBy="areas", cascade=CascadeType.ALL)
public Collection<Level> getLevels() {
return levels;
}
public void setLevels(Collection<Level> levels) {
this.levels = levels;
}
public void addLevel(Level level)
{
if (! levels.contains(level))
{
levels.add(level);
}
}
public Area() {
levels = new ArrayList<Level>();
}
public Area(Long id, String name) {
this();
this.id = id;
this.name = name;
}
@Id
@Column(name = "Id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
persistence.xml
<persistence-unit name="Demo" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/__mySQL</jta-data-source>
<class>fi.pelireissu.model.Club</class>
<class>fi.pelireissu.model.Team</class>
<class>fi.pelireissu.model.Rink</class>
<class>fi.pelireissu.model.Game</class>
<class>fi.pelireissu.model.StatGroup</class>
<class>fi.pelireissu.model.Level</class>
<class>fi.pelireissu.model.Area</class>
<properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.logging.level" value="FINEST"/>
<property name="eclipselink.logging.parameters" value="true"/>
</properties>
</persistence-unit>