# JPA (EclipseLink) und Oracle Datenbank



## xlChaos (17. Jun 2021)

Guten Tag zusammen,

ich sitze zur Zeit mit meinem SW Projekt Team (Studium) vor einem scheinbar unlösbaren Problem.

Wir schreiben ein Programm für ein imaginäres Surfcenter. Es soll möglich sein Gegenstände zu verleihen (Stichwort Ausleihe anlegen) und wieder zurück zu nehmen -> Rückgabe anlegen.

Wir arbeiten mit Java 12, Eclipse und den o.g. Werkzeugen.  Es funktioniert auch eigentlich bereits fast alles nur eine Sache ist leider etwas schwierig. Wenn wir in einer Sitzung im Programm eine Ausleihe anlegen, dann auf "Bestätigen" drücken, soll das Programm quasi wieder zurück in die Ausleihverwaltung springen und die dortige JTable die gerade angelegte Ausleihe anzeigen. Das funktioniert auch soweit. Aber man kann in der selben Sitzung leider keine Rückgabe zu dieser gerade erzeugten Ausleihe anlegen, er zieht sich irgendwie die Daten nicht in das Rückgabe Anlegen Fenster (wohlgemerkt, die ID der Ausleihe, die in ein JLabel geschrieben wird zieht er sich aber trotzdem und zeigt diese korrekt an). Wenn wir das Programm beenden und wieder in die Ausleihverwaltung gehen, kann ganz normal eine Rückgabe zu dieser Ausleihe erstellt werden. Das hat also höchstwahrscheinlich was mit dem Thread (wovon ich leider nicht viel Ahnung habe) zu tun.

Wir arbeiten mit EntityManagern, die wir bei jeder DB Operation im Programm erstellen und zum Schluss ein getTransaction().commit; tätigen.



[CODE lang="java" title="Methode zur Ausleiherstellung"]public void generiereAusleihe() {
        long diff = planRueckgabeDatum.getTime()/1000/60-ausleihDatum.getTime()/1000/60;
        //Stunden
        double stundenFaktor  = diff/60;
        ausleihe = new Ausleihe();

        Kunde kunde = sucheKunde(Long.parseLong(kundenNr));



        for (Inventar inv : this.inventare) {
            inv.setStatus("verliehen");
            AusleihPosition p = new AusleihPosition();
            p.setAuftrag(ausleihe);
            p.setInventar(inv);
            p.setSchaden(false);
            p.setKaufwunsch(false);
            //Preis pro Position
            p.setPreis(p.getInventar().getPreiskategorie().getPreisProZE()*stundenFaktor);
            DatabaseConnector.getEntityManager().persist(p);
        }



        ausleihe.setAuftragsart("Ausleihe");
        ausleihe.setKunde(kunde);
        ausleihe.setMitarbeiter(mitarbeiter);
        ausleihe.setStandort(ctrl.getCtrl().getStandort());
        ausleihe.setErstellungsdatum(erstellungsdatum);
        ausleihe.setAusleihdatum(ausleihDatum);
        ausleihe.setPlanRueckgabedatum(planRueckgabeDatum);
        //Gesamtpreis
        double gesamtpreis=0.00;
        for(Inventar i:inventare) {
            gesamtpreis = gesamtpreis+ i.getPreiskategorie().getPreisProZE()*stundenFaktor;
        }
        ausleihe.setPreis(gesamtpreis);


        // DatabaseConnector.getEntityManager().persist(inventar1);
        DatabaseConnector.getEntityManager().getTransaction().begin();
        DatabaseConnector.getEntityManager().persist(ausleihe);

        // Wird benï¿½tigt um Tabelle in GUI upzudaten
        ctrl.getAuftragsListe().add(ausleihe);
        ctrl.getAusleihverwaltungTablemodel().fireTableDataChanged();
        DatabaseConnector.getEntityManager().getTransaction().commit();

    }[/CODE]


[CODE lang="java" title="Erstellung der Ausleihverwaltung"]public void ermittleAusleihen () {
        EntityManager em = DatabaseConnector.getEntityManager();
        Query query = em.createQuery("Select B FROM Auftrag B WHERE B.disc='Ausleihe'");
        auftragsListe = query.getResultList();
        this.tablemodel = new AusleihverwaltungTableModel(auftragsListe);
    }[/CODE]

[CODE lang="java" title="Ermittle Ausleihen aus der Ausleihverwaltung"]    public void ermittleAusleihe(long id) {
        EntityManager em = DatabaseConnector.getEntityManager();
        Ausleihe result = em.find(Ausleihe.class,id);
        this.positionen = result.getPositions();
        konvertiereListe();
        this.rueckgabeTable = new RueckgabeTableModel(auslPositionen);
        this.ausleihe = result;
    }[/CODE]

Hat jemand vielleicht einen Ansatz wo wir suchen sollten?

Danke schon mal!


----------



## Oneixee5 (17. Jun 2021)

xlChaos hat gesagt.:


> this.rueckgabeTable = new RueckgabeTableModel(*auslPositionen*);


Wo kommt denn die Variable *auslPositionen *her?


----------



## xlChaos (18. Jun 2021)

Oneixee5 hat gesagt.:


> Wo kommt denn die Variable *auslPositionen *her?


Sry, das ist unvollständig. Die kommt aus der konvertiereListe() Methode. Ist ein Klassenattribut.

Wir haben den Fehler by the Way gefunden, lag daran das wir vergessen haben dem neuen Ausleih Objekt die passende Positionsliste zuzuweisen.


----------

