Toon posts:

[oo] databaselayer

Pagina: 1
Acties:

Verwijderd

Topicstarter
hallo allemaal

ik heb even gegoogeld en ik weet dat er voor databanken mooie dingen zijn zoals hybernate maaar aangezien ik nog tamelijk noob ben heb ik dus mijn layer als volgt gemaakt
acces klasse en dan voor al mijn tabelen een klasse apart

nu zit ik met volgend probleem ik moet in sql een join doen over 3 tabellen moet ik hiervoor dan een aparte klasse maken (dus een klasse waarin ik het logisch verband tussen die 3 klassen leg), een zoektocht op google leverde bijna altijd links op naar hybernate

alvast dank
Tom

Verwijderd

ik maakte wel een aparte klasse ervoor, je zou die join ook uit meerdere klasses kunnen opbouwen dus setCustomer( Customer customer ) setAndereObject etc.

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
http://www.hibernate.org/ is de officiele site. Kijk daar maar eens. Kleine waarschuwing, de opstap is wel redelijk hoog, dus probeer een simpele tutorial te zoeken, er staan er genoeg op de Hibernate site.

[edit] Misschien moet je eens naar design patterns kijken. Ik ben niet zo goed in de namen van die dingen, maar er zijn er zeker weten een paar die je kunnen helpen structuur in je huidige probleem te brengen. Hier http://www.theserverside.com/patterns/index.tss staan er al redelijk wat, en voor nog meer info moet je eens Googlen op Fowler (schrijver van diverse boeken over dit onderwerp)

[ Voor 49% gewijzigd door zneek op 29-01-2005 10:44 ]


Verwijderd

Als ik hibernate zo snel even bekijk, lijkt Propel er veel op. Propel lijkt mij de PHP variant van hibernate. Propel is ontworpen voor PHP5.

[ Voor 56% gewijzigd door Verwijderd op 29-01-2005 12:08 ]


Verwijderd

Verwijderd schreef op zaterdag 29 januari 2005 @ 02:48:
nu zit ik met volgend probleem ik moet in sql een join doen over 3 tabellen moet ik hiervoor dan een aparte klasse maken (dus een klasse waarin ik het logisch verband tussen die 3 klassen leg), een zoektocht op google leverde bijna altijd links op naar hybernate
dit lijkt mij iets voor iBatis SQL maps en een bean met alle velden van je joined query (dus ja, een aparte bean).

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op zaterdag 29 januari 2005 @ 02:48:
ik heb even gegoogeld en ik weet dat er voor databanken mooie dingen zijn zoals hybernate maaar aangezien ik nog tamelijk noob ben heb ik dus mijn layer als volgt gemaakt
acces klasse en dan voor al mijn tabelen een klasse apart
Dit is geen werk voor beginners. Een data access layer maken met O/R mapping technologie lijkt simpel maar je bent een inmense hoeveelheid tijd kwijt om het goed te krijgen en als beginner verzandt je al snel. Geloof me, de vraag die jij stelt is een simpele, je bent nog niet eens toe aan de wat complexere zaken zoals een graph saven in de juiste volgorde, change tracking etc. etc. Ik wil je niet ontmoedigen, maar om programmeren/java te leren lijkt me het zinvoller om gewoon MET een O/R mapper te gaan werken, bv Hibernate, en dan, mocht je nieuwsgierig zijn, te kijken hoe het in hibernate is opgelost, het is open source tenslotte. Je zult zien dat het tamelijk complex is.
nu zit ik met volgend probleem ik moet in sql een join doen over 3 tabellen moet ik hiervoor dan een aparte klasse maken (dus een klasse waarin ik het logisch verband tussen die 3 klassen leg), een zoektocht op google leverde bijna altijd links op naar hybernate
Je moet eerst dingen definieren alvorens je dit op kunt lossen: wat is een entity, wat is een entity representatie, waar sla ik representatie <-> DDL meta data op, wat is een relatie tussen 2 entities...

Simpel? Nee niet echt. 9 van de 10 mensen denkt nl. dat een relatie tussen 2 entities echt bestaat, maar dat is niet het geval (attributes hebben een relatie en die attributes hebben weer een relatie met de attributes in de entities waarin ze zitten). Door inzicht te krijgen in deze materie, krijg je automatisch de oplossing aangereikt. Het probleem met relaties wordt opgelost door gemakshalve te zeggen "Customer heeft relatie met Order (1:n)" en "Order heeft relatie met customer (m:1)". 2 relaties waar je wellicht eigenlijk 1 dacht aan te treffen.

Om van operaties op entity representaties (je classes) naar DML in SQL te komen is vrij lastig. ten eerste moet je van entity representatie (je class) naar table oriented DML (een class kan 2 of meer tables in zich hebben). De operatie kan meerdere entity representaties omvatten (get me all customers with orders in June 2004).

Je gaat dan nadenken over hoe je dat zou willen formuleren. Aangezien je met sets werkt, moet je denken vanuit een set based wereld: in het voorbeeld wat ik net gaf heb je de set customers en de set orders en je wilt een subset van de set orders die je samenstelt mbv een subset uit de set orders. Zodoende kom je op je query language uit, dus hoe je je operaties op entities wilt formuleren (niet in collection.GetCustomers() denken, maar in een soort taal)

Wanneer je dat hebt geformuleerd zal je dus tegen het feit aanlopen dat je operaties wilt uitvoeren die meerdere entities omvatten, zoals in ons voorbeeld. Omdat je je taaltje al hebt geformuleerd weet je hoe je relaties moet aangeven. De feitelijke implementatie hangt af van hoe je met je core werkt: connected of disconnected. Bij een connected core, heb je in je code altijd een 'session' of 'context' bij de hand waarin de meta-data is opgeslagen. Die meta-data bevat informatie over de relaties tussen alle entities. Je kunt dan dus volstaan met het aangeven van welke van de bekende relaties je wilt gebruiken. Bij een disconnected core heb je dat niet en moet je de core de relatie aanreiken. Dit kan bv door een relatie class te definieren waarin je aangeeft welke fields van welke entities een relatie hebben, welke van de sides de PK side is en wat het type is van de relatie (als je je afvraagt waarom je moet aangeven welke side de PK side is, ga maar eens nadenken over 1:1 relaties :P)

In ons voorbeeld is het dus zaak dat je je core aangeeft dat deze de relatie Customer - Order (1:n) gaat gebruiken. Dus de elementen die onze set filters omvatten zijn:
- Relatie: Customer - Order (1:n)
- Filter op Order.OrderDate: Order.OrderDate between 01-06-2004 AND 30-06-2004
- Set to return: Customer.*

Een DML SELECT operatie is net zo duidelijk:
SELECT <selectlist uit total set>
FROM <relaties te gebruiken om total set te bouwen>
WHERE <filters op total set>

Dus doe je:
Voor SELECT: SELECT <genereer hier alle fields van Customer, mbv meta data>
Voor FROM: pak de relatie(s). In dit geval Customer - Order. Je gaat gemakshalve even van de makkelijkste variant uit: CUSTOMER INNER JOIN ORDER (Customer - Order is 'weak', dus LEFT/RIGHT joins leveren andere resultaten op wellicht). Een INNER JOIN verlangt een ON clause, dus die genereer je mbv de relatie gegevens die je OF haalt uit de meta-data (connected) of uit de aangereikte relatie object (disconnected).
Voor WHERE: aangezien where clauses bestaan uit 'predicates' die genest kunnen zijn en altijd true of false opleveren kun je dit recursief genereren. we hebben hier 1 filter dus genereer je:
WHERE (Order.OrderDate BETWEEN @param1 AND @param2))

Je onderdelen zijn klaar en je plakt ze samen tot de query die je naar je query core stuurt.

Succes! :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 15-05 20:04
Ik heb zelf alleen ervaring met Kodo voor het persistent maken van klassen in Java, maar dat beviel me niet echt. De Kodo JDO implementatie is namelijk zo traag als dikke stront. Is dat Hybernate ook gewoon een JDO implementatie of werkt dat anders?

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Verwijderd schreef op zaterdag 29 januari 2005 @ 11:10:
Als ik hibernate zo snel even bekijk, lijkt Propel er veel op. Propel lijkt mij de PHP variant van hibernate. Propel is ontworpen voor PHP5.
Ik gebruik sinds een tijdje ook Propel(/Creole), dat eigenlijk een 'loose' port is van Apache Torque. Je merkt wel dat e.e.a. wat langer duurt door de abstractielaag, maar dat kan met een cache voor een groot deel wel ondervangen worden, en de tijd die ik er qua ontwikkeling mee bespaar vind ik eigenlijk veel belangrijker :).

Ik gebruik overigens naast de PHP5 versie ook met tevredenheid de PHP4 backport (te vinden in de CVS). Je hebt dan alleen wel PHP5 nodig voor propel-generator.

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
FallenAngel666 schreef op zaterdag 29 januari 2005 @ 13:51:
Ik heb zelf alleen ervaring met Kodo voor het persistent maken van klassen in Java, maar dat beviel me niet echt. De Kodo JDO implementatie is namelijk zo traag als dikke stront. Is dat Hybernate ook gewoon een JDO implementatie of werkt dat anders?
Hibernate is in ieder geval niet traag als dikke stront, alhoewel, gegeven een genoeg brakke config kun je het wel traag maken, maar het is mij nog niet gelukt :)
Pagina: 1