[Hibernate] Intelligenter Hibernate Join

Status
Nicht offen für weitere Antworten.

ilumin

Mitglied
Hallo,

mein erster Post und gleich eine Frage.. :)

ich migriere derzeit eine altgediente Anwendung von einer Client Applikation
hin zu einer Webanwendung mit Spring MVC und Hibernate. Dazu existiert
eine Oracle Datenbank welche in ihrer Struktur nicht angepasst (wenn nur minimal)
werden soll.

Wir haben verschiedene Benutzer deren Benutzer id in jeder Tabelle
bei jedem Datensatz mit geschrieben wird (feld user_Id). Wir haben eine Tabelle
bezeichnungen und eine Tabelle bezeichnungstexte welche einen dreiteiligen
primärschlüssel hat: bezeichnungs_id, sprache, user_id

Es existiert ein default user (id 1) welchem alle bezeichnungstexte zugeordnet sind.
Dieser default userhält die default bezeichnungstexte. wenn ein user einen eigenen
bezeichnungstext für eine Position erstellt dann soll automatisch dieser verwendet werden
und nicht der default bezeichnungstext.

in hibernate habe ich beispielsweise folgende selects:

Code:
select
  p.wert,
  p.prozent,
  b.text
from
  Position p
  join p.bezeichnung.bezeichnungstext b (<-- knackpunkt)
where
  p.user.id = 213

(nur schematisch / exemplarisch dargestellt)

jetzt möchte ich durch Hibernate Mechanismen, AOP oder sonst
irgendwie den join zum Bezeichnungstext so haben dass er mir
den default bezeichnungstext (user_id = 1) liefert wenn
kein bezeichnungstext mit einer user_id = 213 vorliegt.

überlegungen wären bisher ob wir keine joins mehr nehmen sondern
nur die bezeichnungs-id's und später die resultsets durch eine
methode jagen welche die entsprechenden bezeichnungen aus der
Datenbank holt (wär mir persönlich unrecht, fühlt sich nicht "straight forward" an).

Gibts sowas wie intelligentes Mapping (schwer zu beschreiben) bzw.
konditionales Mapping? Intelligente Stellvertreter Objekte über die ich joine
anstatt die automatisch von Hibernate generierten (eclipse hibernate tools)
und mir diese Bedingung prüfen / abfangen / erfüllen (wenn ja wie)?

schwer zu erklären ich hoffe es wird klar und jemand hat mir hier den
entscheidenden Tip...

bitte um hilfe, alle alternativen gern gesehen!

Grüße,

Pascal
 

ms

Top Contributor
Wie würdest du es denn mit plain SQL machen?
Mir fällt auf die schnelle nur eine CASE-Anweisung ein.

ms
 

ilumin

Mitglied
z.b. ein subselect für die bezeichnungstexte. naja ich hatte einfach gehofft dass mir hibernate hier "elegantere" möglichkeiten bietet.
bzw. ich wäre schon glücklich wenn ich es mit hibernate überhaupt (!) irgendwie hinbekommen würde. gern auch mit nem interceptor also über aop oder sonstwie.
 

ms

Top Contributor
Sofern ich das richtig verstanden habe scheint mir diese Aufgabenstellung einfach zu trivial mit normalen Mitteln lösbar zu sein, als mit AOP, Interceptoren, usw...
Was spricht denn gegen ein Subselect oder eine Case-Anweisung?

ms
 

ilumin

Mitglied
dass ich jeden der x-hundert querys durchgehen und anpassen müsste. ich möchte ungern sql (oder fast sql) schreiben wenn ich schon etwas wie hibernate einsetze. natrülich komme ich irgendwie an die richtigen bezeichnungstexte, allerdings eben überall von hand mit nem subselect.

Wünschenswert wäre es einfach wenn ich mir hibernate so schlau machen könnte dass es mir automatisch bei einem join auf die bezeichnungstexte die richtigen bezeichnungstexte liefert ohne dass ich in jeden query case oder subselects reinbringe.
 

ms

Top Contributor
Wie willst du auf Hibernate umstellen, wenn du die vorhandenen SQL-Queries nicht angreifst?

Wenn es nicht zuviel ist dann poste doch mal bitte deine gemappten Klassen (also nur die für diesen Teil relevanten), die Mappingfiles sowie ein oder zwei vorhandene Select-Statements wo das bisher schon funktioniert.

ms
 

ilumin

Mitglied
wir haben bereits auf hibernate umgestellt. Die applikation ist lauffähig und nahezu produktiv. es geht hier um weitere features die wir in die anwendung nachträglich einfügen wollen, wie z.b. die möglichkeit bezeichnungstexte zu customisen. meine Fragestellung hier bezieht sich nicht auf die migration der anwendung (das warn nur hintergrund infos) sondern um das anpassen der migrierten version, dem webclient welcher bereits vollständig in spring und hibernate implementiert ist.

die sql statements der alten applikation sind irrelevant da wir die neue applikation nur auf der alten Datenbasis, nicht aber der Codebasis aufgebaut haben also from scratch. In der alten Applikation existiert keine mehrbenutzerfähigkeit ergo auch keine user_id's. Im Moment holen wir über einen join einfach die entsprechenden bezeichnungstexte wollen hier allerdings nun die möglichkeit bieten eigene bezeichnungstexte anzulegen und das möglichst ohne jeden einzelnen query erneut anfassen zu müssen (hql query, nicht sql query).

evtl drücke ich mich einfach nicht klar genug aus
 

ilumin

Mitglied
ja, durch die eclipse hibernate tools ging das nahezu automatisch. ist allerdings schon ne ecke her da wir das ganz zu Beginn der Entwicklung gemacht haben. Das sind hier einfache, "dumme" Pojo's mit Atributen und entsprechenden Gettern und Settern dazu. mehr nicht.
 

ms

Top Contributor
Mehr brauchts ja auch nicht sein.
Kannst du mal so ein Pojo posten?
Möchte gerne die Relationen zu den Texten sehen.

ms
 

ilumin

Mitglied
Hilft das so?

Code:
// Faelligkeit.java:
   private Bezeichnung	pefBezeichnungen;

// Bezeichnung.java:
   private Set		pefBeztextes				= new HashSet( 0 );

// Beztext.java:
   private BeztextId	id;
   private String		bezeichnung;

// BeztextId.java:
   private Bezeichnung	pefBezeichnungen;
   private String		sprache;
   private User gvaUser;

// User.java
  private Long id;


Faelligkeit -> Bezeichnung -> Beztext -> BeztextId -> User
 

ms

Top Contributor
Code:
// Bezeichnung.java:
   private Set		pefBeztextes				= new HashSet( 0 );
Ist das ein Set von BeztextId's?

ms
 

KSG9|sebastian

Top Contributor
Warum lagerst du die Logik um den richtigen Satz zu ermitteln nicht in eine StoredProcedure aus?
Ansonsten bleibt wohl nur
a) Subselect
b) Case
c) per AOP in die Ausführung des Querys eingreifen und den Query manipulieren.

Wobei ich mir nicht vorstellen kann wie man das sinnvoll mit AOP lösen könnte, da die Querys ja immer unterschiedlich sind.
Das du machen könntest wäre mit AOP einzugreifen und wenn kein Ergebniss kommt (weil nichts für user_id xyz hinerlegt ist) denselben Query mit einer anderes user_id nochmal aufrufen.
 

ms

Top Contributor
Gibt es den DefaultUser nur um die Default-Texte zuzuordnen?
Wenn dem so ist, dann halte ich schon das Modell für nicht ganz praktisch.
Den Standardtext hätte ich unabhängig von einem User definiert, also z.B. eine Klasse Standardtext.
Und einen Benutzerabhängigen Text hätte ich von dieser Klasse abgeleitet, z.B. Benutzertext. Diese Klasse hätte zusätzlich noch ein Userobjekt verknüpft.
Damit stellt sich dann nicht das Problem bei der Abfrage nach dem richtigen Text.
Es müsste nur sichergestellt werden, dass beim Erzeugen einer Faelligkeit die Standardtexte zugeordnet sind.

ms
 
I

ilumine

Gast
ms dein Ansatz klingt plausibel. ich werde das mal so umsetzen und schaun ob uns das weiter bringt. danke fürs erste!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Hibernate / JPA: Eine Datenbank und pro User ein Schema Data Tier 9
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
E Hibernate: Session vs EntityManager Data Tier 3
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
D JPA vs Hibernate.cfg und Entitymanager Data Tier 6
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
G JSF Hibernate no session or session was closed Data Tier 12
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
G Hibernate Composite key Data Tier 11
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]1:1 Beziehung Data Tier 8
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6
G Hibernate 0...1 : 1 Beziehung Data Tier 6
G Hibernate mehrere @oneToone Data Tier 2

Ähnliche Java Themen


Oben