Objekt löschen -> Ganze Tabelle gelöscht.

Status
Nicht offen für weitere Antworten.

eSK

Mitglied
Hallo Zusammen,

ich habe folgendes Problem; ich suche mir mit Hilfe einer Long-ID einen Datensatz raus und lösche diesen.

Code:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void deletePortal(Long idPortal, boolean withChilds) throws ChildHasOtherParentsException, EntityNotFoundException {
Portal delPortal = em.find(Portal.class, idPortal);
        LogUtil.log("Removing Portal '" + delPortal.getName() + "'", Level.INFO, null);
        if (withChilds) {
            for (Topic thema : delPortal.getTopics()) {
                if (thema.getPortals().size() > 1) throw new ChildHasOtherParentsException();
                LogUtil.log("Removing Topic (as Child of '" + delPortal.getName() + "') with Name '" + thema.getName() + "'", Level.INFO, null);
                em.remove(thema);
            }
        }
        em.remove(delPortal);
    }

Leider ist nach einem Aufruf wie
Code:
pDAO.delete(1L, false);
die ganze Tabelle leer. Was mache ich falsch, oder ist das ein Bug?

Ich nutze den JBoss 4.2.2.GA und eine Oracle 9i-Datenbank.
 

eSK

Mitglied
Welches Attribut meinst du genau?

Hier nochmal der Code für die Klasse Portal, vielleicht hilft das weiter:
Code:
package de.essen.gdi.domain.entities;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;


@Entity
@Table(name = "PORTALE", schema = "DBSCHILDER", uniqueConstraints = {})
public class Portal implements java.io.Serializable {
    
    // Fields
    private static final long serialVersionUID = 1L;
    private Long              idPortal;
    private String            name;
    private String            url;
    private Set<Map>          maps             = new HashSet<Map>(0);
    private Set<Topic>        topics           = new HashSet<Topic>(0);
    
    // Constructors
    
    /** default constructor */
    public Portal() {}
    
    /** minimal constructor */
    public Portal(Long idportal, String name, String url) {
        this.idPortal = idportal;
        this.name = name;
        this.url = url;
    }
    
    /** full constructor */
    public Portal(Long idportal, String name, String url, Set<Map> maps, Set<Topic> topics) {
        this.idPortal = idportal;
        this.name = name;
        this.url = url;
        this.maps = maps;
        this.topics = topics;
    }
    
    // Property accessors
    @Id
    @Column(name = "IDPORTAL", unique = true, nullable = false, insertable = true, updatable = true, 
    precision = 22, scale = 0)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence.idportal")
    @SequenceGenerator(name = "sequence.idportal", sequenceName = "IDPORTAL", allocationSize = 1)
    public Long getIdPortal() {
        return this.idPortal;
    }
    
    public void setIdPortal(Long idportal) {
        this.idPortal = idportal;
    }
    
    @Column(name = "NAME", unique = false, nullable = false, insertable = true, updatable = true, length = 50)
    public String getName() {
        return this.name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Column(name = "URL", unique = false, nullable = false, insertable = true, updatable = true, length = 50)
    public String getUrl() {
        return this.url;
    }
    
    public void setUrl(String url) {
        this.url = url;
    }
    
    @ManyToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
    @JoinTable(name = "PORTALE_ZU_KARTEN", schema = "DBSCHILDER", joinColumns = { @JoinColumn(name = 
    "IDPORTAL", unique = false, nullable = false, insertable = true, updatable = false) }, inverseJoinColumns = { 
    @JoinColumn(name = "IDKARTE", unique = false, nullable = false, insertable = true, updatable = false) })
    public Set<Map> getMaps() {
        return this.maps;
    }
    
    public void setMaps(Set<Map> maps) {
        this.maps = maps;
    }
    
    @ManyToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "portals")
    public Set<Topic> getTopics() {
        return this.topics;
    }
    
    public void setTopics(Set<Topic> topics) {
        this.topics = topics;
    }
    
}

[edit]Zeilenumbrüche eingefügt...
 

tfa

Top Contributor
Nimm mal das cascade = { CascadeType.ALL } testweise raus, bzw. ändere es auf REFRESH oder MERGE.

/EDIT: Wenn die Portal-Tabelle leer ist, wenn du ein Portal löscht, vergiss das mit dem Cascade. Das bezieht sich natürlich nur auf abhängige Tabellen.
 

KSG9|sebastian

Top Contributor
Welche Tabelle ist dann komplett leer?
Wie sieht die Tabelle aus wenn du 3 oder 4 Portale eingefügt hast?

Was sagt der Debugger?
Funktioniert der Generator sauber?
 

eSK

Mitglied
hmm... mache ich, aber sollte das nicht auf all stehen? Ich will ja, dass bei einer Löschung des Portals die Beziehungen in der m-n-Tabelle mitgelöscht werden. Genau so wie ich möchte, dass die Beziehungen gelöscht werden, wenn ein "Topic" entfernt wird (das Gleiche gilt natürlich für "Maps").

Für den Fall, dass die untergeordneten Entitäten mitgelöscht werden sollen (nur bei Topics), gibt es ja den boolean-Parameter "withChilds".

Hab ich einen Denkfehler?
 

eSK

Mitglied
Ja ich meinte die Portal-Tabelle, die ist dann leer.

Der Debugger sagt nichts außergewöhnliches (nur die Log-Meldungen die ich ausgeben lasse) und die Tabellen sehen auch so aus, wie sie aussehen sollen, wenn ich Portale hinzufüge.


Also die Änderung zu "merge" hat funktioniert, aber ich verstehs trotzdem nicht ... oder beziehen sich die Cascades nur auf die Objekte, nicht die Tabellen dahinter? Bei einem Delete eines Portals löscht er jedenfalls nun, so wie er es soll, die Zeile in der Portal-Tabelle und die Einträge in den m-n-Tabellen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben