2016-07-26 23 views
0

ich konfrontiert das gleiche Problem wie empty tables when using many to many relations in jpa. Leider war dieser Beitrag ohne Lösung. Ich habe eine Klasse mit einer Viele-zu-Viele-Beziehung in JPA/EclipseLink v2.6.3. Hier ist die Klasse ROLLE:Leere Liste (nicht Tabelle) bei ManyToMany-Relation

@Entity 
public class Role implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) 
@JoinTable(name = "ROLE_COMPETENCE", joinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "COMPETENCE_ID", referencedColumnName = "ID")) 
private List<Competence> competences = new ArrayList<Competence>(); 


@Override 
public String toString() { 
    return "Role [id=" + id + "]"; 
} 

public void addCompetence(Competence competence) { 
    if (this.competences != null) { 
     if (!this.competences.contains(competence)) { 
      this.competences.add(competence); 
      competence.addRole(this); 
     } 
    } 
} 

public int getId() { 
    return id; 
} 

public Role() { 
    super(); 
} 


public List<Competence> getCompetences() { 
    return competences; 
} 

} 

Und die Klasse COMPETENCE

@Entity 
public class Competence implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 

@Column(length = 1024, nullable = false) 
private String title; 

@JsonIgnore 
@ManyToMany(mappedBy = "competences", fetch = FetchType.EAGER, cascade = CascadeType.MERGE) 
private List<Role> roles; 

public int getId() { 
    return id; 
} 

public Competence() { 
    super(); 
} 

public void addRole(Role role) { 
    if (this.roles != null) { 
     if (!this.roles.contains(role)) { 
      this.roles.add(role); 
      role.addCompetence(this); 
     } 
    } 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public List<Role> getRoles() { 
    return roles; 
} 

@Override 
public String toString() { 
    return "Competence [id="+id+", title="+title+"]"; 
} 

} 

Wenn ich jetzt

for (int i = 0; i < 10; i++) { 
    Role role = new Role(); 
    RoleService.create(role); 

    for (int j = 0; j < 3; j++) { 
     Competence c = new Competence(); 
     c.setTitle("Competence "+i+"."+j); 
     CompetenceService.create(c); 
     lastCompetence = c; 
    role.addCompetence(c); 
    } 

    RoleService.update(role); 
} 

mit

public void x(Object object) { 
    EntityManager em = ... 
    EntityTransaction tx = em.getTransaction(); 
    tx.begin(); 
    em.merge(object); //for x=update or em.persist(object) for x=create 
    tx.commit(); 
    em.close(); 
} 

Das Merkwürdige ist, dass die join- Tabelle ROLE_COMPETENCE ist korrekt wenn Ich füge Objekte hinzu oder entferne sie. Wenn ich ROLEs lade, haben sie Kompetenzen, die gezeigt werden können. Aber die Liste "Rollen" ist leer, wenn ich Kompetenzen aus der Datenbank lade.

Irgendeine Idee?

+0

Scheint wie Problem mit dem Laden, erhalten Sie einen Fehler wie LazyLoading ?? –

+0

Nein, ich bekomme nur eine ** Warnung ** wegen Drop-Create-Shema in Persistence.Xml: Aufruf: _ALTER TABLE ROLE_COMPETENCE ADD CONSTRAINT FK_ROLE_COMPETENCE_COMPETENCE_ID FREMDSCHLÜSSEL (COMPETENCE_ID) REFERENZEN KOMPETENZ (ID) Abfrage: DataModifyQuery (sql = " ALTER TABLE ROLE_COMPETENCE ADD CONSTRAINT FK_ROLE_COMPETENCE_COMPETENCE_ID FREMDSCHLÜSSEL (COMPETENCE_ID) REFERENZEN COMPETENCE (ID) ") _ –

Antwort

0

Ich habe meinen Fehler gefunden. Es war nur so, dass die Liste nicht instanziiert wurde. Mit List<Role> roles = new ArrayList<Role>(); funktioniert alles gut.