-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Entfernene eines Eintrages in der Liste einer 1:m Beziehung
PostPosted: Fri May 07, 2010 1:41 pm 
Newbie

Joined: Fri May 07, 2010 1:29 pm
Posts: 2
Hallo zusammen,

kenn mich mit Hibernate noch nicht so aus, daher ist dies vermutlich eine Anfängerfrage.

Ich habe 2 Entitäten welche in einer 1:m Beziehung haben.

Verbunden sind sie mit den Annotations ManyToOne und OneToMany und werden in einer <List> abgelegt.

wenn ich nun aus der Liste einen Eintrag entferne und das Objekt wieder mit persist in die DatenBank schreibe, wird die Zeile in der anderen Tabelle nicht gelöscht sondern ist immernoch vorhanden.
Nach einem refresch des Objektes ist es wieder in der Liste drin.

Hat jemand eine Ahnung wie ich dies verhindern kann?

Meine Tabellen sehen so aus:
PK = Primary Key
FK = Foreign Key

Bestellung: ID (PK), Datum
BestellDetail: ID (PK), BID (FK auf Bestellung), AID (FK auf Artikel)

in Java habe ich folgende Annotations:
Code:
Bestellung:
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "BID", nullable = false)
    private Integer bid;
    @Basic(optional = false)
    @Column(name = "Datum", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date datum;
    @OneToMany(mappedBy="bestellung", cascade=CascadeType.ALL)
    private List<PBestellDetails> details;

BestellDetail:
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID", nullable = false)
    private Integer id;
    @ManyToOne
    @JoinColumn(name = "BID", nullable = false)
    private PBestellungen bestellung;
    @ManyToOne
    @JoinColumn(name = "ABID", nullable = false)
    private PArtikel artikel;
    @Column(name = "Menge")
    private Integer menge;
    @Column(name = "Status")
    private String status;
    @Column(name = "Liefertermin")
    @Temporal(TemporalType.DATE)
    private Date liefertermin;


Top
 Profile  
 
 Post subject: Re: Entfernene eines Eintrages in der Liste einer 1:m Beziehung
PostPosted: Fri May 07, 2010 2:35 pm 
Newbie

Joined: Thu May 06, 2010 11:36 am
Posts: 5
Location: Munich, Germany
Hi,

Ja, bei deinem Datenmodell kann das nicht funktionieren. Mit einem Wort die Lösung: Du musst das BestellDetail, was du aus der Bestellung herausnehmen willst, wirklich löschen (mit entityManager.remove() oder ähnlich). Aus der Liste in Bestellung.details brauchst du es dann nicht mehr entfernen, nach einem Refresh wird es automatisch weg sein (aus dem gleichen Grund, warum es im Moment automatisch wieder drin ist, selbst wenn du es löschst).

Begründung: In einer 1:n Beziehung ist -- wie auch im Leben so oft :-) -- immer eine der beiden Seiten "führend". Das heißt, Änderungen auf dieser Seite wirken sich auf die Datenbank und (nach einem Refresh) dann auch auf der anderen Seite aus. Änderungen auf der anderen (nicht-führenden) Seite hingegen existieren nur im Speicher und werden ignoriert. Welche Seite die führende ist, wird durch das "mappedBy"-Attribut bestimmt: die Entity, bei der dieses Attribut angegeben ist, ist die nicht-führende, sondern -- wie der Name schon sagt -- folgt blind dem Mapping der angegebenen Property in der anderen Entity.

Konkret heißt das bei dir: Was in der Liste Bestellung.details drin steht, wird einzig dadurch bestimmt, bei welchen BestellDetails die Property "bestellung" auf die aktuelle Bestellung zeigt. Du kannst an der Liste herumfummeln bis zum Umfallen, das wird nichts bewirken. Die Liste ist mehr oder weniger nur aus Komfortgründen da, damit du leichter auf die Details kommst. Du kannst mal probeweise die Liste Bestellung.details ganz aus der Entity löschen, das wird auf der DB nichts ändern, und alles wird funktionieren. Dann müsstest du dir die Details aber halt manuell per SQL/HQL holen.

Wenn du aus der Liste was löschen willst, dann musst du es auf der führenden Seite löschen, also in diesem Fall bei BestellDetail.bestellung. Normalerweise müsstest du BestellDetail.bestellung einfach auf NULL setzen, dann wäre die Beziehung zur Bestellung weg und nach dem Refresh wäre dieses BestellDetail dann auch in der zugehörigen Bestellung nicht mehr drin. Da BestellDetail.bestellung bei dir aber mit "nullable = false" definiert ist -- was auch Sinn macht -- kannst du das nicht NULL setzen, weil dann das BestellDetail "in der Luft" hängen würde. Daher musst du die komplette BestellDetail-Entity aus der Tabelle löschen (oder -- was realistischer ist -- in eine Art "Archiv" verschieben), dann wird sie auch bei der Bestellung verschwinden.


HTH + Viele Grüße,

Michael

_________________
There are 10 kinds of people -- those who understand binary, and those who don't


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
cron
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.