hibernate双向映射插入和删除初学者

时间:2017-11-15 19:37:03

标签: java hibernate

今天我做了一些关于hibernate的实验。不幸的是,似乎我对会话有些误解。 我有三个实体(书“buch”,用户“benutzer”和租“leihstellung”)。 每本书都知道租金,它关注的是。每个租金都知道相关的书籍。此外,每个租金都知道适合的用户,当然每个用户都知道相关的租金。

我明确希望有这种双向映射。

现在我写了一个插入一些数据的小测试器。插入进度按预期工作。插入一些数据后,我想删除一个用户。 如果我在提交之前这样做,hibernate会给我一个错误,因为用户将被重新插入它所属的租金(如果我从这个租金中手动删除用户,甚至会发生这种情况)。在这里,我真的不明白为什么会这样。

如果我进行session.close并打开一个删除用户的新会话,一切正常。

我想,在一个会话中有一种更聪明的方法可以做到这一点。但不幸的是,我不知道如何做到这一点。 欢迎任何解释。

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;
    }



}

1 个答案:

答案 0 :(得分:0)

自己找到解决方案。我不得不删除连接的租金和书籍中的参考文献。 现在一切正常。