Toon posts:

[Java] Hibernate design issue - vertaalde teksten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hej Tweakers.. Zoals velen van jullie ben ik bijzonder enthousiast met het
gebruik van hibernate. Ik loop echter tegen een design issue aan waar ik
met hibernate niet op een gedegen oplossing kan komen (met sql kan het
wel, maar ik wil niet terug ;( ). Ik heb in mijn relationele model twee tabellen
die belangrijk zijn:

*******************
* Items **
********************
* int sentence_id *
********************
|
|
*****************************
Sentences *
******************************
* int sentence_id (pk) *
* varchar language (pk) *
******************************

Via diverse koppelingen kom ik in de bestaande db structuur telkens deze
opzet tegen.. een tabel met items en een tabel met alle vertalingen. Ik kan
echter geen goede opzet vinden om binnen b.v. een outer join alle items MET
vertalingen op te halen.. Omdat je de betreffende taal pas 'runtime' weet moet
ik de koppeling eigenlijk in een query zetten, maar ik kan geen goede FK
aangeven. (Ik zoek eigenlijk een outer join waarmee ik de items gelijkertijd met
de sentences van mijn keus wil ophalen, maar hibernate (2) forceert deze
in seperate queries :( Heeft iemand een dergelijk probleem al een opgelost,
want ik denk dat ik het een stuk moelijker zie dan het werkelijk is.

Mauws

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 19-02 13:45
Hoe ziet je mapping er uit? Het is nu een beetje gokken wat er mis gaat. Sowieso klopt het ook niet dat Items een FK heeft naar Sentences op basis van sentence_id terwijl de PK uit sentence_id en language bestaat.

Cuyahoga .NET website framework


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 12:01
als we aannemen dat je db model als volgt is:

items (id pk, sentence fk references sentences (id));
sentences (id pk, language pk, text);

krijg je items met bijbehorende sentence voor een bepaalde taal als volgt:

select i, (from sentences s where s.id = i.sentence and language = :lang)
from items i

dus je krijgt een Object[] array met op index 0 het item en op index 1 het sentence object voor de lang parameter.

Edit: select-clause subselects zijn trouwens een Hibernate 3 feature, anders is misschien het volgende mogelijk:

select i, s
from item i
left join i.sentences s
where s.language = :lang

[ Voor 20% gewijzigd door matthijsln op 07-04-2006 17:17 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Map die sentence in een item als een Map met als key de taal en als value de waarde.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 12:01
Gert schreef op vrijdag 07 april 2006 @ 17:31:
Map die sentence in een item als een Map met als key de taal en als value de waarde.
Het is nogal lastig om in een HQL query een conditie op de key van een map collection te zetten, tenminste ik weet niet hoe dat moet. Ik heb ook zo'n soort datamodel waarbij ik een map gebruikte, maar daarmee ontkwam ik niet aan N+1 selects waarbij zelfs ALLE talen werden opgehaald in plaats van alleen de taal welke nodig was.

[ Voor 40% gewijzigd door matthijsln op 07-04-2006 17:40 ]


Verwijderd

http://www.hibernate.org/...ence/en/html/filters.html

code:
1
2
3
4
5
6
7
<set ...>
    <filter name="myFilter" condition=":lngCd = language "/>
</set>

..

session.enableFilter("myFilter").setParameter("lngCd", "nl_BE");



Lijkt me niet zo slecht gegeven het feit dat de vertaling voor die taal aanwezig MOET zijn...

Verwijderd

Topicstarter
[quote]matthijsln schreef op vrijdag 07 april 2006 @ 17:37:
[...]


Aan de posts te zien zijn er in hibernate3 in ieder geval meer mogelijkheden. Het lastige is dat ik in hibernate2 vaak de relatie wel kan leggen, maar er een normale outer join gelegd kan worden.. daardoor vuren we echt veel te veel queries af... Wat is mij afvraag, is het ophalen van
b.v. 'alle' vertalingen sneller dan de overhead van een nieuwe query met enkel de taal die
ik nodig heb ?? Bedanks voor de repy's .. ik ga eens aan het experimenteren met die
Map en de hibernate3 filters... :)

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 12:01
Alle vertalingen cachen is misschien nog niet eens zo'n slecht idee, je zou een eigen implementatie van ResourceBundle (oid) maken voor je teksten uit de database. Deze resource bundle zou je dan tijdens initialisatie van je app aanmaken en beschikbaar maken voor je hele app.

Het wordt wel iets lastiger indien tijdens runtime teksten aangepast worden. De wijzigingen moet je dan wel doorpropageren naar die bundle (met synchronization).
Pagina: 1