2017-11-15 10 views
0

今日私は休止状態でいくつかの実験を行った。残念ながら、セッションに関する何かを誤解しているようです。 私は3つのエンティティ(ブック "buch"、ユーザ "benutzer"と家賃 "leihstellung")を持っています。 各書籍は家賃について知っています。それぞれの家賃は関連書籍を知っています。さらに、それぞれの家賃は、適合するユーザを知っており、もちろん、各ユーザは、関連する家賃を知っている。休止状態の双方向マッピング挿入および削除初心者

明示的にこの2通りのマッピングが必要です。

私はいくつかのデータを挿入する小さなテスターを書いた。挿入の進行状況は、期待通りに機能します。いくつかのデータを挿入した後、私はユーザーを削除したいと思います。 コミットの前にこれを行うと、hibernateは私にエラーを返します。なぜなら、ユーザーは自分が属する賃貸借で再挿入されるからです(この賃貸借から手動でユーザーを削除したとしても)。ここで私はそれがなぜ起こるのか本当に理解しません。

私はsession.closeを実行して、ユーザーを削除するための新しいセッションを開くとすべてうまく動作します。

私は、1セッションでこれを行うよりスマートな方法があると思います。しかし、残念ながら私はこれがどのように行われるのか分かりません。 説明は大歓迎です。

public class Worker implements Iworker{ 

    private Sessiongetter sg; 

    private MainMenu mm; 

    public void work(File datei) 
    { 
     sg = new Sessiongetter(); 
     Session session = sg.getSesseion(); 
     WlBuchart wlBuchart = new WlBuchart(1, "Sachbuch"); 

     Buch buch = new Buch("test", "ich", 1); 
     buch.setWlBuchart(wlBuchart); 
     Buch buch2 = new Buch("versuch", "du",2); 
     buch2.setWlBuchart(wlBuchart); 
     session.beginTransaction(); 
     session.save(wlBuchart); 
     session.save(buch); 
      session.save(buch2); 

     Benutzer benutzer = new Benutzer("hans", "dampf", "Lehrer", "versuch"); 
     session.save(benutzer); 

     Leihstellung leihstellung = new Leihstellung(benutzer, buch); 
     Leihstellung leihstellung2 = new Leihstellung(benutzer, buch2); 
     session.save(leihstellung); 
     session.save(leihstellung2); 

     benutzer.addLeihstellung(leihstellung); 
     benutzer.addLeihstellung(leihstellung2); 
     session.update(benutzer); 

     buch.addLeihstellung(leihstellung); 
     buch2.addLeihstellung(leihstellung2); 
     session.update(buch); 
     session.update(buch2); 
     session.remove(benutzer); 

     session.flush(); 
     session.getTransaction().commit(); 


     session.close(); 


     System.out.println("fertig"); 
    } 

package code.logik; 

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.Session; 

@Entity 
@Table(name="benutzer") 
public class Benutzer { 

    @Column(nullable=false) 
    private String vorname, nachname, gruppe; 
    @Id 
    private String kennung; 
    private boolean admin; 
    @Column(nullable=true) 
    private String kennwort; 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="benutzer") 
    private List<Leihstellung>leihstellungs; 


    public String getKennwort() { 
     return kennwort; 
    } 

    public void setKennwort(String kennwort) { 
     this.kennwort = kennwort; 
    } 

    public Benutzer(String vorname, String nachname, String gruppe, String kennung) { 
     this.vorname=vorname; 
     this.nachname=nachname; 
     this.gruppe=gruppe; 
     this.kennung=kennung; 
     this.leihstellungs= new ArrayList<>(); 

    } 

    public Benutzer() { 
     // TODO Auto-generated constructor stub 
    } 

    public String getVorname() { 
     return vorname; 
    } 

    public String getNachname() { 
     return nachname; 
    } 

    public String getGruppe() { 
     return gruppe; 
    } 

    public String getKennung() { 
     return kennung; 
    } 

    public boolean isAdmin() { 
     return admin; 
    } 

    public void setAdmin(boolean admin) { 
     this.admin = admin; 
    } 

    public List<Leihstellung> getLeihstellungs() { 
     return leihstellungs; 
    } 

    public void addLeihstellung(Leihstellung leihstellung) 
    { 
     leihstellungs.add(leihstellung); 
    } 



    public int compare(Benutzer other) 
    { 
     if (this.getNachname().compareTo(other.getNachname())!=0) 
     { 
      return this.getNachname().compareTo(other.getNachname()); 
     } 
     return this.getVorname().compareTo(other.getVorname()); 
    } 


} 

package code.logik; 

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.annotations.ManyToAny; 

@Entity 
@Table(name="buch") 
public class Buch { 

    @Column(nullable=false) 
    private String titel; 
    private String autor; 

    @ManyToOne 
    private WlBuchart wlBuchart; 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="buch") 
    private List<Leihstellung>leihstellungs; 

    public WlBuchart getWlBuchart() { 
     return wlBuchart; 
    } 

    public void setWlBuchart(WlBuchart wlBuchart) { 
     this.wlBuchart = wlBuchart; 
    } 

    @Id 
    private int nummer; 



    public Buch(String titel, String autor,int nummer) { 
     this.titel=titel; 
     this.autor=autor; 
     this.nummer=nummer; 
     leihstellungs = new ArrayList<>(); 
    } 

    public Buch() { 
     // TODO Auto-generated constructor stub 
    } 


    public String getTitel() { 
     return titel; 
    } 

    public String getAutor() { 
     return autor; 
    } 



    public int getNummer() { 
     return nummer; 
    } 

    public List<Leihstellung> getLeihstellungs() { 
     return leihstellungs; 
    } 

    public void addLeihstellung(Leihstellung leihstellung) 
    { 
     leihstellungs.add(leihstellung); 
    } 


} 


package code.logik; 

import java.time.LocalDate; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name="leihstellung") 
public class Leihstellung { 

    @ManyToOne 
    private Benutzer benutzer; 

    @Id @GeneratedValue 
    private int id; 

    @Column(nullable=false) 
    private LocalDate von; 

    private LocalDate bis; 

    @ManyToOne 
    private Buch buch; 

    public Leihstellung(Benutzer benutzer, Buch buch) { 
     this.benutzer=benutzer; 
     this.buch=buch; 
     this.von = LocalDate.now(); 
    } 

    public Leihstellung() { 
     // TODO Auto-generated constructor stub 
    } 

    public void setAbgegeben() 
    { 
     bis = LocalDate.now(); 
    } 

    public Benutzer getBenutzer() { 
     return benutzer; 
    } 

    public int getId() { 
     return id; 
    } 

    public LocalDate getVon() { 
     return von; 
    } 

    public LocalDate getBis() { 
     return bis; 
    } 

    public Buch getBuch() { 
     return buch; 
    } 



} 
+0

コードを投稿したのではなく、正常に動作するコードを投稿したようです。 –

+0

申し訳ありませんが、これを更新しました –

答えて

0

自分で解決策を見つけました。私は接続された家賃や本から参照を削除する必要がありました。 これですべてが動作します。

関連する問題