TOPIC: JPA-SQL mit Fremdschlüsseln gelöst !
5 months 1 week ago #1020
Hola Rapidclipse-Team,
Fremdschlüssel sind für die referenzielle Intigrität einer DB eine praktische Sache .
Doch mit allen Rapidclipse-Versionen funtioniert eine JPA-Abfrage mit Fremdschlüsseln nicht.

Der Import zeigt die Relationen richtig an , eine aufgezogene Tabelle wird mit den Relationen richtig dargestellt und in den Fieldgroups werden für die Fremdschlüssel Comboboxen gesetzt. Bei den Properties der Tabelle ist natürlich Autoquery und DATA abgewählt . Soweit ist alles ok .

Der JPA-Editor zeigt keine Fehler an , eine zugehörige Abfrage über ein velueEvent zeigt auch keine Fehler an , aber bei einer Preview bleibt die VIEW leer !
mfg
almendros_1
Last Edit: 4 months 2 weeks ago by almendros_1.
The administrator has disabled public write access.
5 months 5 days ago #1026
Hallo Almendros,

nur eine Frage zum Verständnis. Was ist eine eine JPA Abfrage mit Fremdschlüsseln? Meinen Sie eine JPA-SQL Abfrage mit JOIN also eine JPA Criteria die dann als Methode im DAO liegt?
Wenn Sie schreiben bleibt die View leer meinen Sie wirklich die ganze View? In diesem Fall müsste es einen StackTrace geben in dem der Fehler beschrieben sein sollte. Diesen könnten Sie Posten.
Bleibt nur die XdevTable leer scheint mir das normal wenn sie Schreiben "Tabelle ist natürlich Autoquery und DATA abgewählt"

RapidClipse Team
The administrator has disabled public write access.
5 months 5 days ago #1033
Herzlichen Dank für die schnelle Antwort auf das Thema Fremdschlüssel ,
ich habe jetzt eine TestView erzeugt und den Vorgang mit folgendem Ergebnis rekonstruiert:
Eine MYSQL-Tabelle wurde mit der Syntax :
ALTER TABLE Tabellenname ADD CONSTRAINT Name FOREIGN KEY (Spaltenname ) REFERENCES (Tabellenname (Spaltenname) ON DELETE CASCADE definiert.
Hinweis zur Option CASCADE - Beim Löschen werden in anderen Tabellen alle Datensätze , die sich auf diesen Datensatz beziehen , gelöscht .
Anschließend wurde mit "Create JPA entiries from tables" importiert. Die Fremdschlüsseldefinitionen wurden mit RAPIDCLIPSE richtig erkannt und es werden auch automatisch die Relationen richtig erzeugt. (Properties :Many to one ,Cascade null)
Bis hier ist alles ok

Jetzt kommt meine Korrektur zum Fehlerablauf :
Mit der JPA-DAO Abfrage .....
findeTestFremdschlüsselTyp(String typ)
{
select * from Stuecklistenstamm
where teilestammTeiletyp=:typ
}
und einem event ....
private void button_buttonClick(final Button.ClickEvent event)
{
final String typ="BG";
this.table.getBeanContainerDataSource().addAll(new StuecklistenstammDAO().findeTestFremdschlüsselTyp(typ));
}
wird eine leere Tabelle angezeigt und folgende Fehlermeldung erzeugt :
Jun 19, 2017 2:06:54 PM com.vaadin.server.DefaultErrorHandler doDefault
SCHWERWIEGEND:
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.company.businessapp_1.entities.TeilestammTeiletyp.typ
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1419)
at org.hibernate.query.Query.getResultList(Query.java:146)
at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:72)
at com.company.businessapp_1.dal.StuecklistenstammDAO.findeTestFremdschlüsselTyp(StuecklistenstammDAO.java:352)
at com.company.businessapp_1.ui.Test_Fremdschlüsselabfrage.button_buttonClick(Test_Fremdschlüsselabfrage.java:33)
at com.company.businessapp_1.ui.Test_Fremdschlüsselabfrage.lambda$0(Test_Fremdschlüsselabfrage.java:61)
usw......

Für Ihre Bemühungen danke ich Ihnen hiermit nochmals ausdrücklich
almendros_1
Last Edit: 5 months 5 days ago by almendros_1.
The administrator has disabled public write access.
5 months 5 days ago #1036
Hallo almendros_1,

jetzt wird es deutlich wo das Problem liegt und es ist hier auch logisch das es so nicht funktionieren kann. Folgende Erklärung sollte hier weiterhelfen:

Beispiel:
Wir haben 2 Tabellen in der Datenbank: Customer und CustomerTyp welche über ein Statement wie Ihres mit einer 1-N Relation verknüpft sind. Daraus werden beim Import ("Create JPA entiries from tables") dann 2 Entities Customer und CustomerTyp. Schaut man sich jetzt das Customer Entity ein bisschen genauer an, so sieht man das der FK in der DB (Typ String oder Integer) durch eine Objektreferenz von Typ CustomerTyp ausgetauscht wurde. Bedeutet das Entity weis nichts mehr von einer FK Spalte mit einem bestimmten Namen. In Ihrem Fall Teiletyp vom Typ String.
Erstellt man nun einen JPA-SQL wie in ihrem Fall so können sie nicht mehr auf die Spalten in der DB referenzieren oder auf den FK prüfen sie müssen auf das Objekt prüfen. Dass würde dann in Ihrem Fall so aussehen.

Hier der DAO Code:
findeTestFremdschlüsselTyp(Teiletyp typ)
{
select * from Stuecklistenstamm
where Teiletyp = :typ
}

Hier der Aufruf:
new StuecklistenstammDAO().findeTestFremdschlüsselTyp(new TeiletypDAO().find("BG"))

Das bedeutet, Sie bauen ein Teiletyp Objekt und übergeben das an die QueryMethode und das Teile Objekt kümmert sich automatisch um die Auflösung zu Datenbank.

RapidClipseTeam
The administrator has disabled public write access.
5 months 2 days ago #1045
.... herzlich Dank für die ausführliche Lösung , ich kann die Ausführungen auch gedanklich nach vollziehen , aber ....

1. Der Maven-Import macht aus den Attribut-Namen automatisch Alias-Namen (also zusammengesetzte Attribute aus beiden Tabellennamen).
2. Diese Alias-Namen konnte ich auch keinem Objekt zuordnen.
Vielleicht sollten Sie das irgendwann einmal mit einer MYSQL-Tabelle testen . (Leider habe ich keine Ahnung wie sich das mit der DB-H2 - Nordwind verhält )
Ich gehe erstmal in eine Denkpause.
Last Edit: 5 months 2 days ago by almendros_1.
The administrator has disabled public write access.