2010-12-28 9 views
1

Dies scheint so ein einfaches Szenario für mich, aber ich kann nicht für das Leben von mir eine Lösung online oder im Druck finden. Ich habe mehrere Objekte wie folgt (getrimmt):Löschen von Objekten mit FK Constraints in Spring/Hibernate

@Entity 
public class Group extends BaseObject implements Identifiable<Long> { 
    private Long id; 
    private String name; 
    private Set<HiringManager> managers = new HashSet<HiringManager>(); 
    private List<JobOpening> jobs; 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(
      name="group_hiringManager", 
      [email protected](name="group_id"), 
      [email protected](name="hiringManager_id") 
    ) 
    public Set<HiringManager> getManagers() { 
     return managers; 
    } 

    @OneToMany(mappedBy="group", fetch=FetchType.EAGER) 
    public List<JobOpening> getJobs() { 
     return jobs; 
    } 
} 

@Entity 
public class JobOpening extends BaseObject implements Identifiable<Long> { 
    private Long id; 
    private String name; 
    private Group group; 

    @ManyToOne 
    @JoinColumn(name="group_id", updatable=false, nullable=true) 
    public Group getGroup() { 
     return group; 
    } 
} 

@Entity 
public class HiringManager extends User { 

    @ManyToMany(mappedBy="managers", fetch=FetchType.EAGER) 
    public Set<Group> getGroups() { 
     return groups; 
    } 
} 

Angenommen, ich möchte ein Gruppenobjekt löschen. In der Tabelle JobOpening und in der Tabelle group_hiringManager gibt es nun Abhängigkeiten, die dazu führen, dass die Löschfunktion fehlschlägt. Ich möchte das Löschen nicht kaskadieren, weil die Manager andere Gruppen haben und die Job-Opening-Gruppen gruppenlos sein können. Ich habe versucht, die remove() - Funktion meines GroupManager zu überschreiben, um die Abhängigkeiten zu entfernen, aber es scheint, als ob, egal was ich mache, sie bestehen, und das Löschen schlägt fehl!

Was ist der richtige Weg, um dieses Objekt zu entfernen?

Antwort

3

Bevor Sie die Gruppe löschen, durchlaufen Sie die Job-Eröffnungsliste der Gruppen und setzen Sie null auf das Gruppenfeld. Oder schreiben Sie eine Aktualisierungsabfrage, die das Gruppenfeld der Job-Eröffnungskategorie ungültig macht. So etwas wie,

Group group = entityManager.find(Group.class, groupId); 

for (JobOpening aJob : group.getJobs()) { 

    aJob.setGroup(null); 
    entityManager.merge(aJob); 
    entityManager.flush(); 
} 

//Then delete group 

entityManager.remove(group); 

Mit Abfrage, so etwas wie,

entityManager.createQuery("update JobOpening set group = null where group.id = :groupId") 
      .setParameter(groupId) 
      .executeUpdate(); 

Dann Gruppe entfernen.

+0

+1: Und ebenso für die Einstellung von Managern. –

+0

Danke für die Antwort. Meine einzige Frage ist dann, wie arbeite ich diesen Code in Spring? Ich stelle mir vor, dass es in der Service-Schicht gehen sollte, da es mehrere Modelle berührt, aber ich kann nicht herausfinden, wie man ein entityManager.flush() aus meinem Manager-Objekt heraus tut. Ohne das wird es nicht gelöscht, selbst wenn ich die Gruppen der Jobs auf null setze und sie über das jobOpeningDao – maxdj

+0

speichern Wenn Sie einen Code von Ihrem dao zeigen, kann ich bessere Lösungen vorschlagen. –

Verwandte Themen