2016-06-19 9 views
2

Abgelöstes Wesen bestanden, um mein Leben in die Hölle zu verwandeln, es ist zwei Tage seit ich dieses Problem hatte und ich habe alles in dieser Web site versucht und nichts funktioniert. So habe ich zwei Tabellen "Module" und "Bescheinigungen", und ich habe eine Liste der Titel des Moduls und was ich tue, nimmt diesen Titel und das Modul abrufen und für jedes Modul möchte ich die Bescheinigungen, die ich bereits erstellt habe . in meinem Beispiel ich verwende ManyToMany Beziehungjpa Ruhezustand: losgelöstes Wesen bestanden zu persistent

so habe ich Thesen folgenden Klassen:

classe Beglaubigungen:

@Entity 
@Table(name = "edep_attestations") 
public class Attestation implements Serializable { 
private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 
     private String title; 
     ... 
     @ManyToMany(mappedBy="attestations") 
     private Set<Module> modules = new HashSet<>(); 

     // getters and setters 
} 

classe Module:

@Entity 
@Table(name = "edep_modules") 
public class Module implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long id; 
    private String title; 
    ... 
    @ManyToMany(fetch = FetchType.EAGER,cascade = {CascadeType.MERGE}) 
    private Set<Attestation> attestations = new HashSet<>(); 
    // getters and setters 
} 

und das ist die Methode, die ich in meiner Bohne

verwende
public String create(){ 
    Module m = null; 
    this.attestationsService.create(attestation); 
    for (String title : moduleTitles) { 
      m = modulesService.getModulebyTitle(title); 
      m.getAttestation().add(attestation); 
      this.modulesService.create(m); 
    } 
    return "success"; 
} 

Klasse modulesService, create-Methode:

public void create(E object) throws Exception { 
    em.clear(); 
    em.persist(object); 
    em.flush(); 
} 
+0

Nun, Sie erstellen die gleiche Bestätigung mehrmals. Warum? –

+0

mein Fehler Ich habe den Code auf das Original bearbeitet –

+0

Ihr Code ist unklar. Wir wissen nicht, woher die Bescheinigung kommt und was die Dienste leisten. Der größte Fehler ist ohnehin, dass Sie einen Transaktionsservice haben sollten, der all dies erledigt, anstatt losgelöste Objekte zu bekommen und sie dann wieder anzubringen. Wenn eine Ausnahme in der Mitte fehlschlägt, ist die Hälfte der Arbeit erledigt, und die Hälfte davon ist nicht, wodurch die Datenbank in einem inkonsistenten Zustand verbleibt. Arbeiten Sie mit angehängten Objekten und stellen Sie sicher, dass Ihr Code transaktional ist. Der Code wird einfacher und schneller. –

Antwort

2

Ich löste dies durch die @GeneratedValue Anmerkung zu entfernen. Es sieht so aus, als ob keine andere Option für mich funktionierte (Auto oder Identität).
Also was mache ich stattdessen: Ich erhalte die maximale ID meiner Tabelle, inkrementiere sie um eins und setze sie manuell auf meine Entität. Wenn ich dann das Objekt behalte, funktioniert es perfekt.

Verwandte Themen