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?
Scheint wie Problem mit dem Laden, erhalten Sie einen Fehler wie LazyLoading ?? –
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) ") _ –