Page 1 of 1

JPAStorage

PostPosted: Thu Apr 09, 2015 1:06 pm
by joha
Hallo liebes Team, ich kämpfe zur Zeit mir dem JPAStorage. Das funktioniert alles ziemlich gut, allerdings ist mir nicht klar, wie ich folgende Situation lösen könnte. Etwas vereinfacht, angenommen, ich habe zwei Entitäten:

Code: Select all
@Entity
public class Flug {
  Airport start;
  Airport ziel;
  [...]
}

@Entity
public class Airport {
  String code;
  [...]
}

JPAStorage flugStorage = new JPAStorage(Flug.class)
flugStorage.setEntityManager(getEntityManager());


Wenn ich nun das ein RemoteDataBook mit Flügen auf dem Client habe, enthält es exakt einmal:

Code: Select all
ColumnDefinition ::[AIRPORT_id] ……..


Wenn ich mit dem Debugger das RemoteDataBook untersuche enthält es in den Metadaten interessanterweise zwei Spalten mit Namen AIRPORT_id. Wenn ich die unterscheiden könnte, wüsste ich allerdings nicht wie ich an die rankomme.

Diese gezeigte ColumnDefinition-Info habe ich mit dem folgenden Code ermittelt:

Code: Select all
for (int counter = 0; counter < rdbLegs.getRowDefinition().getColumnCount(); ++counter) {
      System.out.println(rdbLegs.getRowDefinition().getColumnDefinition(counter));
}


Was ich aber bräuchte wäre:

Code: Select all
ColumnDefinition ::[start_id] ……..
ColumnDefinition ::[ziel_id] ……..


Oder noch besser direkt:

Code: Select all
ColumnDefinition ::[start_id] ……..
ColumnDefinition ::[start_code] ……..
ColumnDefinition ::[ziel_id] ……..
ColumnDefinition ::[ziel_code] ……..



Das habe ich versucht mit folgenden Code zu erreichen:

Code: Select all
  JPAForeignKey jpaForeignKey = new JPAForeignKey();
  jpaForeignKey.setKeyClass(Long.class);
  jpaForeignKey.setSingleIdAttribute(true);
  jpaForeignKey.setReferencedColumnNames(new String[]{"icaoCode"});
  jpaForeignKey.setDetailEntitiesMethode("getStart");
  flugStorage.createAutomaticLinkReference(jpaForeignKey, Airport.class);


Das Ergebnis ist aber genau wie ohne diesen Code. Was mache ich falsch?

Viele Grüße!

Re: JPAStorage

PostPosted: Thu Apr 09, 2015 2:08 pm
by Support@SIB
Welche JVx Version verwenden Sie?
Die JPA Storage wurde bisher noch nicht auf die aktuellen Metadaten Anpassungen von JVx vorbereitet.

Gibt es einen speziellen Grund warum Sie die JPAStorage einsetzen anstatt DBStorage - reines interesse.


Sie sollten in Ihrem Fall zumindest die beiden IDs in den Metadaten erhalten und mit DBStorage erhalten Sie auch zusätzlich die codes. Im Falle von JPAStorage sieht es nach einem Fehler in der Implementierung aus bzw. wurde diese Möglichkeit nicht implementiert.

Bitte erstellen Sie ein Ticket und fügen ein Testprojekt bei, um den Entwicklern die Analyse zu erleichtern, ansonsten werden die Entwickler garantiert darauf hinweisen.

Als Workaround können Sie von Airport die Klassen AirportStart und AirportZiel ableiten und im Flug Objekt verwenden.

Re: JPAStorage

PostPosted: Thu Apr 09, 2015 2:25 pm
by joha
Vielen Dank für die prompte Antwort. Ich verwende JPAStorage weil ich damit experimentiere, ein bestehendes System das auf JPA-Entities basiert auf JVx umzustellen. Ich verwende v2.2 und habe JPAStorage an die API-Änderungen angepasst. Zumindest glaube ich das :-) Der Aufwand war vielleicht eine Stunde. Wenn sie Interesse haben versuche ich die Änderungen gerne zu commiten.

Meinen Sie JPAStorage und DBStorage zu mischen? Die Idee ist mir bislang nicht gekommen. Hätte allerdings auch Bedenken, weil DBStorage wohl die Caches von JPA umgeht.

Das Ticket lege ich gleich an.

Danke!

Re: JPAStorage

PostPosted: Thu Apr 09, 2015 2:51 pm
by joha
Eine Ergänzung zur Frage "Warum JPA": Einer der Gründe weshalb ich ungern auf JPA verzichten möchte ist, weil ich hibernate-envers zum automatischen Auditieren verwende.

Re: JPAStorage

PostPosted: Thu Apr 09, 2015 10:24 pm
by Support@SIB
Ja, sie können natürlich DBStorage und JPAStorages mischen, allerdings müssten Sie die Connection an DBAccess übergeben. Wäre aber möglich.

DBStorage hat MetaDaten Caches und ist extrem performant umgesetzt. Hat jedoch keinen Daten Cache. Dafür können Sie damit Commit/Rollback verwenden und auf Row Locking zurückgreifen. Das ist mit JPA eher schwierig zu lösen.

Bei Ihrem Use-Case macht die JPAStorage natürlich Sinn und ist mit DBStorage so nicht abzudecken, speziell hibernate-envers.


Bzgl. API Anpassungen: Sie müssten ein CLA unterzeichnen, damit wir den Code übernehmen können. Andernfalls kann nicht sichergestellt werden das rechtlich alles in Ordnung ist. Dieser Mechanismus ist mittlerweile bei allen bekannten open source Projekten üblich.

Wir würden uns aber sehr freuen wenn Sie Ihre Anpassungen für die Community bereitstellen würden, denn die Anpassungen sind sicher hilfreich. Aber natürlich ist auch schon geholfen, wenn Sie mit Tickets unterstützen.

Re: JPAStorage

PostPosted: Fri Sep 18, 2015 10:25 pm
by Support@SIB
Die aktuelle Version 1.2 unterstützt JVx 2.3 und kann mit FKs besser umgehen, siehe BLOG Post.