Programim dhe zhvillim, javascript, python, php, html

Hibernate Cascade: De-referenca e prindit PK në tabelën e fëmijëve pa hequr objektin e fëmijës

Nëse një objekt prind fillon me një listë prej 3 objektesh fëmijë, heq fëmijën 1 dhe thërret session.update(prind), çfarë lloj hartash hibernate do të më duhej për të pastruar PK-në e prindit nga tabela e hequr e fëmijëve pa fshirë atë të hequr fëmijë plotësisht?

Kam gjithashtu një kufizim që parandalon fshirjen e çdo prindi nëse atij i caktohet ndonjë fëmijë dhe një kufizim tjetër që më pengon të fshij aksidentalisht çdo hyrje të fëmijës.

Mund t'i përditësoj me sukses fëmijët duke thirrur thjesht session.update(prind), por kam vështirësi të bëj të kundërtën.

public class Parent implements Serializable {
  private static final long serialVersionUID = 1L;
  private Long id;
  private List<Child> children;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @OneToMany(mappedBy = "parent")
  @org.hibernate.annotations.Cascade( 
        value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
  public List<Child> getChildren() {
    return children;
  }

  public void setChildren(List<Child> children){
    this.children = children;
    for(Child child : children) {
      child.setParent(this);
    }
  }

  //-----------------   Would I need something like this?  ---------------
  //----------------- Or does hibernate have a better way? ---------------
  public void setChildren(List<Child> children){

    for(Child child : this.children)
        if (!children.contains(child)) {
          child.setParent(null);
        }
    }
    this.children = children;
    for(Child child : children) {
      child.setParent(this);
    }
  }
  //----------------------------------------------------------------
}

public class Child implements Serializable {
  private static final long serialVersionUID = 1L;
  private Long id;
  private Parent parent;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @ManyToOne
  public Parent getParent() {
    return parent;
  }

  public void setParent(Parent parent) {
    this.parent = parent;
  }
}

Kjo zgjidhje është e ngjashme, por unë nuk po fshij prindin, përkundrazi po heq një fëmijë nga lista:

hibernate kaskadën - përditëso fëmijën në null

15.07.2011

Përgjigjet:


1

Nëse nuk keni një kufizim jo-nul në fushën e prindit FK në tabelën e fëmijëve, thjesht mund ta vendosni prindin në null dhe ta ruani fëmijën.

Unë do të shkruaja metodën e mëposhtme:

Boolean removeChild(Child c) {
    Boolean success = getChildren().remove(c);
    if(success) c.setParent(null);
    return success;
 }

Do të isha i kujdesshëm në lidhje me mbishkrimin e metodës setChildren, pasi hibernate kërkon marrës dhe vendosës të thjeshtë.

15.07.2011

2

Unë mendoj se ju do të duhet të vendosni manualisht prindin e elementit të fshirë në null. Nuk ka asgjë në hibernate që do ta bëjë këtë për ju. Ju mund të bëni pak më mirë duke përdorur një Koleksion i vëzhgueshëm nga Projekti Better Beans Binding. Pastaj mund të hiqni vendosësin tuaj dhe të reflektoni menjëherë ndryshimet.

public class Parent implements Serializable, ObservableListListener {
     private static final long serialVersionUID = 1L;
  private Long id;
  private List<Child> children;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @OneToMany(mappedBy = "parent")
  @org.hibernate.annotations.Cascade( 
        value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
  public List<Child> getChildren() {
    return children;
  }
  void  listElementPropertyChanged(ObservableList list, int index) { // Do Nothing }
  void  listElementReplaced(ObservableList list, int index, java.lang.Object oldElement) {
       listElementAdded(list.get(index));
       listElementRemoved(oldElement);
  }
  void  listElementsAdded(ObservableList list, int index, int length) {
       for(int i = index; i < index + length; i++) {
          ((Child)list.get(i)).setParent(this);
       }
  }
  void  listElementsRemoved(ObservableList list, int index, java.util.List oldElements) {
       for(object element : oldElements) {
          ((Child)list.get(i)).setParent(null);
       }
   }
}
15.07.2011
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..