3

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>

amdixon
  • 3,814
  • 8
  • 25
  • 34
  • 1
    It should create the table "LEVEL_AREA" for you as a join table with columns areaId and levelId. Do the logs not show an error when trying to create tables? What is it creating, and what errors do you get if you populate or query your model? Try explicietely naming the table you want to use: @JoinTable(name="LEVEL_AREA",schema="demo", joinColumns={@JoinColumn(name="areaId")}, inverseJoinColumns={@JoinColumn(name="levelId")}) – Chris Sep 28 '15 at 18:05
  • I tried setting name before without success. Now I added name and schema as you suggested and table was created. Thanks! – Tero Meriläinen Sep 28 '15 at 18:37

0 Answers0