JPA (EclipseLink) Neuer Eintrag in Collection speichern (unidirektional)

H4rr1s

Mitglied
Hallo zusammen,

ich habe folgendes Problem:

Ich möchte eine unidirectionale Beziehung erstellen.

Java:
@Entity
@Table(name = "Hochschule")
public class Hochschule implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int hochschulnummer;
    private String bezeichnung;
    private String land;
    
    
    // Assotiationen
    @OneToMany(cascade= {CascadeType.ALL}, fetch= FetchType.EAGER)
    @JoinTable(
            name="hochschule_lehrveranstaltung",
            joinColumns = @JoinColumn( name="Hochschule_HOCHSCHULNUMMER"),
            inverseJoinColumns = @JoinColumn( name="lehrveranstaltungPartnerhochschule_LEHRVERANSTALTUNGNUMMER")
        )
    private Set<Lehrveranstaltung> lehrveranstaltungHochschule;

public Lehrveranstaltung erfasseNeueLehrVeranstaltung(String lehrVeranstaltungsBezeichnung, int ects) {       
        Lehrveranstaltung neuLehrveranstaltung = new Lehrveranstaltung(lehrVeranstaltungsBezeichnung, ects);
        this.lehrveranstaltungHochschule.add(neuLehrveranstaltung); 
        EntityManagerTool.entityManager.getTransaction().begin();
        EntityManagerTool.entityManager.persist(lehrveranstaltungHochschule);
        EntityManagerTool.entityManager.flush();      
        EntityManagerTool.entityManager.getTransaction().commit();
        return neuLehrveranstaltung;
    }

Hier die Klasse Lehrveranstaltung

Java:
@Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int lehrveranstaltungNummer;
    private String bezeichnung;
    private int ects;

So nun der fehlercode der kommt wenn ich die Methode erfasseNeueLehrVeranstaltung aufrufe:

...
[EL Finest]: 2013-02-02 23:01:24.05--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection released to connection pool [default].
[EL Finest]: 2013-02-02 23:01:24.051--ServerSession(22143172)--Thread(Thread[main,5,main])--Execute query ReadObjectQuery(name="file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU" referenceClass=Antrag )
[EL Finest]: 2013-02-02 23:01:24.051--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default].
[EL Fine]: 2013-02-02 23:01:24.051--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--SELECT ANTRAGSNUMMER FROM Antrag WHERE (ANTRAGSNUMMER = ?)
bind => [851]
[EL Finest]: 2013-02-02 23:01:24.053--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection released to connection pool [default].
[EL Finest]: 2013-02-02 23:01:24.058--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Hochschule@cead66
[EL Finest]: 2013-02-02 23:01:24.058--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@1e4d7c8
[EL Finest]: 2013-02-02 23:01:24.058--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@dc3416
[EL Finest]: 2013-02-02 23:01:24.059--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@112bba0
[EL Finest]: 2013-02-02 23:01:24.059--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@dfa655
[EL Finest]: 2013-02-02 23:01:24.059--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Antrag@da3b58
[EL Finest]: 2013-02-02 23:01:24.061--ServerSession(22143172)--Thread(Thread[main,5,main])--Execute query ReadAllQuery(name="file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU" referenceClass=Prioritaet )
[EL Finest]: 2013-02-02 23:01:24.062--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default].
[EL Fine]: 2013-02-02 23:01:24.062--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--SELECT t1.ID, t1.ISTGENEHMIGT, t1.PARTNERHOCHSCHULE_HOCHSCHULNUMMER, t1.LEARNINGAGREEMENT_LEARNINGAGREEMENTNUMMER FROM Antrag_Prioritaet t0, Prioritaet t1 WHERE ((t0.Antrag_ANTRAGSNUMMER = ?) AND (t1.ID = t0.listePrioritaeten_ID))
bind => [851]
[EL Finest]: 2013-02-02 23:01:24.064--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection released to connection pool [default].
[EL Finest]: 2013-02-02 23:01:24.064--ServerSession(22143172)--Thread(Thread[main,5,main])--Execute query ReadObjectQuery(name="file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU" referenceClass=Hochschule )
[EL Finest]: 2013-02-02 23:01:24.064--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default].
[EL Fine]: 2013-02-02 23:01:24.064--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--SELECT HOCHSCHULNUMMER, BEZEICHNUNG, LAND FROM Hochschule WHERE (HOCHSCHULNUMMER = ?)
bind => [501]
[EL Finest]: 2013-02-02 23:01:24.066--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection released to connection pool [default].
[EL Finest]: 2013-02-02 23:01:24.066--ServerSession(22143172)--Thread(Thread[main,5,main])--Execute query ReadAllQuery(name="file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU" referenceClass=Lehrveranstaltung sql="SELECT t1.LEHRVERANSTALTUNGNUMMER, t1.BEZEICHNUNG, t1.ECTS FROM hochschule_lehrveranstaltung t0, Lehrveranstaltung t1 WHERE ((t0.Hochschule_HOCHSCHULNUMMER = ?) AND (t1.LEHRVERANSTALTUNGNUMMER = t0.lehrveranstaltungPartnerhochschule_LEHRVERANSTALTUNGNUMMER))")
[EL Finest]: 2013-02-02 23:01:24.066--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default].
[EL Fine]: 2013-02-02 23:01:24.066--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--SELECT t1.LEHRVERANSTALTUNGNUMMER, t1.BEZEICHNUNG, t1.ECTS FROM hochschule_lehrveranstaltung t0, Lehrveranstaltung t1 WHERE ((t0.Hochschule_HOCHSCHULNUMMER = ?) AND (t1.LEHRVERANSTALTUNGNUMMER = t0.lehrveranstaltungPartnerhochschule_LEHRVERANSTALTUNGNUMMER))
bind => [501]
[EL Finest]: 2013-02-02 23:01:24.067--ServerSession(22143172)--Connection(1055340)--Thread(Thread[main,5,main])--Connection released to connection pool [default].
[EL Finest]: 2013-02-02 23:01:24.069--ServerSession(22143172)--Thread(Thread[main,5,main])--Execute query ReadObjectQuery(name="file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU" referenceClass=Hochschule )
[EL Finest]: 2013-02-02 23:01:24.069--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Prioritaet@16661e8
[EL Finest]: 2013-02-02 23:01:24.069--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Hochschule@a5d04b
[EL Finest]: 2013-02-02 23:01:24.069--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@14612ad
[EL Finest]: 2013-02-02 23:01:24.069--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@518bfc
[EL Finest]: 2013-02-02 23:01:24.069--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@1bd662c
[EL Finest]: 2013-02-02 23:01:24.07--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Lehrveranstaltung@17450d3
[EL Finest]: 2013-02-02 23:01:24.07--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Prioritaet@b9cca6
[EL Finest]: 2013-02-02 23:01:24.07--UnitOfWork(2045225)--Thread(Thread[main,5,main])--Register the existing object fachklassen.Hochschule@a5d04b
[EL Finer]: 2013-02-02 23:01:32.879--Thread(Thread[AWT-EventQueue-0,6,main])--fixUNC: before fixing: url = file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/, authority = , file = /C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/ (There is no English translation for this message.)
[EL Finer]: 2013-02-02 23:01:32.879--Thread(Thread[AWT-EventQueue-0,6,main])--fixUNC: after fixing: url = file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/, authority = null, file = /C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/ (There is no English translation for this message.)
[EL Finest]: 2013-02-02 23:01:32.898--ServerSession(22143172)--Thread(Thread[AWT-EventQueue-0,6,main])--Begin predeploying Persistence Unit LearningAgreementErfassenPU; session file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU; state Deployed; factoryCount 1
[EL Finest]: 2013-02-02 23:01:32.898--ServerSession(22143172)--Thread(Thread[AWT-EventQueue-0,6,main])--End predeploying Persistence Unit LearningAgreementErfassenPU; session file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU; state Deployed; factoryCount 2
[EL Finest]: 2013-02-02 23:01:32.899--ServerSession(22143172)--Thread(Thread[AWT-EventQueue-0,6,main])--Begin deploying Persistence Unit LearningAgreementErfassenPU; session file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU; state Deployed; factoryCount 2
[EL Finest]: 2013-02-02 23:01:32.899--ServerSession(22143172)--Thread(Thread[AWT-EventQueue-0,6,main])--End deploying Persistence Unit LearningAgreementErfassenPU; session file:/C:/Users/Neo/Documents/NetBeansProjects/LearningAgreementErfassen/build/classes/_LearningAgreementErfassenPU; state Deployed; factoryCount 2
[EL Finer]: 2013-02-02 23:01:32.9--ServerSession(22143172)--Thread(Thread[AWT-EventQueue-0,6,main])--client acquired: 11923348
[EL Finer]: 2013-02-02 23:01:32.9--ClientSession(11923348)--Thread(Thread[AWT-EventQueue-0,6,main])--acquire unit of work: 8652792
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Object: [fachklassen.Lehrveranstaltung@1d95c7d, fachklassen.Lehrveranstaltung@1b87cd4, fachklassen.Lehrveranstaltung@150c50b, fachklassen.Lehrveranstaltung@122effd, fachklassen.Lehrveranstaltung@10b7ca0] is not a known entity type.
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4169)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:440)
at fachklassen.Hochschule.erfasseNeueLehrVeranstaltung(Hochschule.java:72)
...


Wie schaffe ich es, dass ich bei einer uniderektionalen Beziehung ein Element der Collection/Set oder wie auch immer hinzufürgen und speichern kann, sodass nicht nur ein Eintrag in die Tabelle Lehrveranstaltungen gemacht wird sondern auch ein Eintrag in die zugehörige JoinTable.

Freundliche Grüße
H4rr1s
 

H4rr1s

Mitglied
Die Klasse Lehrveranstaltung:

Java:
@Entity
@Table(name = "Lehrveranstaltung")
@NamedQuery(
        name = "LehrVeranstaltungSuchen",
query = "Select s from Lehrveranstaltung s where s.lehrveranstaltungNummer = :id or s.bezeichnung like :bez")
public class Lehrveranstaltung implements Serializable {

    private int lehrveranstaltungNummer;
    private String bezeichnung;
    private int ects;

    public Lehrveranstaltung() {
    }

    public Lehrveranstaltung(int lehrveranstaltungNummer, String bezeichnung, int ects) {
        this.lehrveranstaltungNummer = lehrveranstaltungNummer;
        this.bezeichnung = bezeichnung;
        this.ects = ects;
    }

    public Lehrveranstaltung(String bezeichnung, int ects) {
        this.bezeichnung = bezeichnung;
        this.ects = ects;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getLehrveranstaltungNummer() {
        return lehrveranstaltungNummer;
    }

    public void setLehrveranstaltungNummer(int lehrveranstaltungNummer) {
        this.lehrveranstaltungNummer = lehrveranstaltungNummer;
    }

    public String getBezeichnung() {
        return bezeichnung;
    }

    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung = bezeichnung;
    }

    public int getEcts() {
        return ects;
    }

    public void setEcts(int ects) {
        this.ects = ects;
    }
}

Die Klasse Hochschule:

Java:
@Entity
@Table(name = "Hochschule")
public class Hochschule implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int hochschulnummer;
    private String bezeichnung;
    private String land;
    
    
    // Assotiationen
    @OneToMany(cascade= {CascadeType.ALL}, fetch= FetchType.LAZY)
    @JoinTable(
            name="hochschule_lehrveranstaltung",
            joinColumns = {@JoinColumn(name="Hochschule_HOCHSCHULNUMMER", referencedColumnName="HOCHSCHULNUMMER")},
            inverseJoinColumns = {@JoinColumn(name="lehrveranstaltungPartnerhochschule_LEHRVERANSTALTUNGNUMMER", referencedColumnName="LEHRVERANSTALTUNGNUMMER")}
        )
    private ArrayList<Lehrveranstaltung> lehrveranstaltungHochschule;

    public Hochschule() {
    }

    public Hochschule(int hochschulnummer, String bezeichnung, String land, ArrayList<Lehrveranstaltung> lehrveranstaltungPartnerhochschule) {
        this.hochschulnummer = hochschulnummer;
        this.bezeichnung = bezeichnung;
        this.land = land;
        this.lehrveranstaltungHochschule = lehrveranstaltungPartnerhochschule;
    }

    public Hochschule(String bezeichnung, String land, ArrayList<Lehrveranstaltung> lehrveranstaltungPartnerhochschule) {
        this.bezeichnung = bezeichnung;
        this.land = land;
        this.lehrveranstaltungHochschule = lehrveranstaltungPartnerhochschule;
    }

    public ArrayList<Lehrveranstaltung> sucheLehrveranstaltung(int lehrveranstaltungNummer, String bezeichnung) {
        ArrayList<Lehrveranstaltung> gefundeneLehrveranstaltungen = new ArrayList<>();
        for(Lehrveranstaltung lv : this.lehrveranstaltungHochschule){
            if(lehrveranstaltungNummer == lv.getLehrveranstaltungNummer()){
                gefundeneLehrveranstaltungen.add(lv);
                return gefundeneLehrveranstaltungen;
            } else {
                if(lv.getBezeichnung().startsWith(bezeichnung)){
                    gefundeneLehrveranstaltungen.add(lv);
                }
            }
        }
        return gefundeneLehrveranstaltungen;
    }

    public Lehrveranstaltung erfasseNeueLehrVeranstaltung(String lehrVeranstaltungsBezeichnung, int ects) {       
        
        EntityManagerTool.entityManager.getTransaction().begin();
        Lehrveranstaltung neuLehrveranstaltung = new Lehrveranstaltung(lehrVeranstaltungsBezeichnung, ects);
        this.lehrveranstaltungHochschule.add(neuLehrveranstaltung); 
        EntityManagerTool.entityManager.persist(lehrveranstaltungHochschule);     
        EntityManagerTool.entityManager.getTransaction().commit();
        return neuLehrveranstaltung;
    }
    
    public int getHochschulnummer() {
        return hochschulnummer;
    }

    public void setHochschulnummer(int hochschulnummer) {
        this.hochschulnummer = hochschulnummer;
    }

    public String getBezeichnung() {
        return bezeichnung;
    }

    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung = bezeichnung;
    }

    public String getLand() {
        return land;
    }

    public void setLand(String land) {
        this.land = land;
    }

    // get set Assotiation
    
    public ArrayList<Lehrveranstaltung> getLehrveranstaltungPartnerhochschule() {
        return lehrveranstaltungHochschule;
    }

    public void setLehrveranstaltungPartnerhochschule(ArrayList<Lehrveranstaltung> lehrveranstaltungPartnerhochschule) {
        this.lehrveranstaltungHochschule = lehrveranstaltungPartnerhochschule;
    }
}

Mit der Methode "erfasseNeueLehrVeranstaltung" in der Klasse Hochschule möchte ich eine neue Lehrveranstaltung in der Tabelle "Lehrveranstaltung" eintragen und einen neuen Eintrag in der JoinTable "hochschule_lehrveranstaltung".

Die Lehrveranstaltung kann ich einzeln speichern nur den Eintrag in der JoinTable bekomme ich einfach nicht hin.
 

Phash

Top Contributor
unidirektional bedeutet doch erstmal:


1:n - one to many und n:1 - many to one

eins zeigt auf mehrere bzw mehrere zeigen auf eins.

Standard ist das in der DB so abgebildet:

die "1" Tabelle (Schüler) weiss, in welcher Schulklasse sie ist. Deswegen zeigt sie auf die Schulklasse
Also "Schüler Max zeigt auf Klasse 7a)

Die Klasse selbst weiss aber erstmal nichts von ihren Schülern.
Sie hat also keinen Wert, der auf alle Schüler von ihr zeigt.

In JPA wird das jetzt allerdings etwas anders gelöst:
der Schüler hat eine Property "Schulklasse meineKlasse" und die Schulklasse hat eine Property "Set<Schüler> meineSchüler"
das macht allerdings nur Hibernate - in der DB ist das nicht drin.

möchtest du das in der DB haben, brauchst du eine m:n Beziehung -> ManyToMany, was allerdings der Realtität entgegenstünde, weil ja die Schüler nicht in mehreren Klassen sein können (oh... ausser man hat noch extra Musik, Religions oder Sportklassen...)

um 1:n in der DB abzufragen machst du ja auch:
SQL:
select * from schüler join klasse where schüler.klasse.bzeeichnung = '7a'
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Testen ob neuer Tag beginnt Allgemeine Java-Themen 37
sambalmueslie Benachrichtigung bei neuer Objekt-Instanz Allgemeine Java-Themen 5
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
J Was ist schneller? Neue Variable oder neuer Wert speziell int Allgemeine Java-Themen 3
T Klasse mit neuer Eigenschaft für jede Subclass (kompliziert) Allgemeine Java-Themen 6
T Thread, neuer Thread => interrupt Allgemeine Java-Themen 4
A Java Prozess in neuer JVM Allgemeine Java-Themen 8
B Installation neuer Packages Allgemeine Java-Themen 8
I JAR aus Applikation in neuer VM ausführen Allgemeine Java-Themen 9
S Generics Hashtable mit "neuer" for-Schleife ausles Allgemeine Java-Themen 4
B CPU --- Neuer Computer muß her . Allgemeine Java-Themen 7
S Wie eine Anwendung als neuer Prozess starten? Allgemeine Java-Themen 8
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
M Registry Autostart Eintrag ertstellen mit Java (Runtime.getRuntime().exec()) Allgemeine Java-Themen 0
Ananaskirsche Input/Output Datei durchlesen und Eintrag herauschreiben Allgemeine Java-Themen 18
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
B MySQL Eintrag erstellen Allgemeine Java-Themen 3
T Windows-Kontextmenü Eintrag hinzufügen? Allgemeine Java-Themen 3
J Eintrag in Datei überschreiben Allgemeine Java-Themen 6
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
S MANIFEST DATEI hat nur einen Eintrag Allgemeine Java-Themen 14
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
J Path-Eintrag unter Windows 7 Allgemeine Java-Themen 11
Z aus private List<???> list eintrag löschen Allgemeine Java-Themen 4
E Swing hilfe, JWindow mit eintrag in taskleiste Allgemeine Java-Themen 2
M Javadoc | Javadoc Eintrag des verlinkten Element einbetten? Allgemeine Java-Themen 4
D Eintrag im Windows Kontextmenü hinzufügen Allgemeine Java-Themen 4
T LDAP - Eintrag löschen Allgemeine Java-Themen 6
B ArrayList eintrag löschen Allgemeine Java-Themen 3
G Hashset einen eintrag zufällig entfernen Allgemeine Java-Themen 4
thE_29 Kontextmenü Shell Eintrag Allgemeine Java-Themen 35
A Mehrzeiligen Eintrag in Ressourcebundle (.properties-Datei) Allgemeine Java-Themen 8
Luma Diskettenlaufwerk rattert los bei Eintrag in JTree Allgemeine Java-Themen 6
B JComboBox-Eintrag ohne Enter aktualisieren Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben