tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1036
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Markus Markus ist offline Rookie
    Registriert seit
    Dec 2007
    Beiträge
    7
    Hi,

    ich habe ein Problem mit den Cascades in Hibernate. Bei meinem letzten Projekt habe ich versucht in die Annotations Cascades für das löschen von Objekten zu definieren.
    Beispiel:

    Note * <- -> 1 Appointment

    Code :
    1
    2
    3
    4
    
    @OneToMany (mappedBy = "Appointment", fetch = FetchType.EAGER)
        @Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
        @JoinColumn(name="FK_ID_APPOINTMENT")
        private Set<Note> Notes;

    Ich wollte die Cascades so definieren, dass wenn ich das Appointment lösche, automatisch alle Notes gelöscht werden.
    Habe dann aber im offiziellen Hibernateforum gelsen, dass von den DELETE-Cascades abgeraten wird. Bei komplexeren Problemen sollte das "individuell" im Code gelöst werden. Habe ich drauf gehört und es folgendermaßen implementiert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public boolean del(int pos) {
            Appointment app = this.get(pos);                   //in einer abstrakten Hibernate-Manager Klasse definiert
            Set<Note> notes = app.getNotes();
            for (Iterator<Note> i = notes.iterator(); i.hasNext();) {
                Note note = (Note)i.next();
                super.delHibernateEntity(note, Note.class);   //in einer abstrakten Hibernate-Manager Klasse definiert
                System.out.println(note.getID());
            }
            app.setAttender_User(new HashSet<User>());
            this.update(app);                        //in einer abstrakten Hibernate-Manager Klasse definiert
            return super.delHibernateEntity(app, Appointment.class);              //in einer abstrakten Hibernate-Manager Klasse definiert
        }

    Meine Frage nun: Was macht für euch mehr Sinn? Cascade oder selbst implementieren?

    Gruß
    Markus
     

  2. #2
    sebastianb sebastianb ist offline Mitglied Gold
    Registriert seit
    Dec 2009
    Beiträge
    125
    Hi,

    also ich verwende hierfür die JPA Annotations und das funktioniert ohne Probleme:

    Department.class
    Code java:
    1
    2
    
    @OneToMany(mappedBy = "department", cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE }, fetch = FetchType.LAZY)
    private Set<Account> accounts;

    Beim Löschen ist nur darauf zu achten, dass die Integrität nicht verletzt wird z.B. wenn es noch Entities gibt, welche die zu löschende Department Entity noch referenzieren.

    Gruß Sebastian
     

  3. #3
    Avatar von robgeb
    robgeb robgeb ist offline Mitglied Bronze
    Registriert seit
    Oct 2007
    Beiträge
    27
    Hi,

    ich bin generell gegen cascade.

    Denn mit wachsender Struktur wird das nicht mehr wartbar. Dann lieber mehr Geist in das Löschen setzen. Da weiß man wenigstens was passiert.

    Einzige Ausnahme an der ich die Cascade-Types setzen würde, wären OneToOne-Beziehungen. Diese Beziehungen kommen aber eben seeehr selten vor
     

Ähnliche Themen

  1. jsf - Hibernate - Caching Probleme
    Von alan79 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 7
    Letzter Beitrag: 24.09.09, 17:54
  2. Hibernate: Mapping v. Beziehungen und was Hibernate daraus macht
    Von DerGrinsemann im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 14.08.08, 12:53
  3. Antworten: 0
    Letzter Beitrag: 12.10.06, 18:07
  4. Probleme mit dem Hibernate Syncronizer
    Von mki_germo im Forum Java
    Antworten: 1
    Letzter Beitrag: 01.06.06, 09:26
  5. [MySQL] ON UPDATE CASCADE ON DELETE CASCADE Problem
    Von SwingTänzer im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 06.08.04, 13:57