Your SlideShare is downloading. ×
Ebean<br />Een hibernate killer<br />Hielke Hoeve<br />TopicusOnderwijs<br />
Ebean<br />(Yet another) ORM implementatie<br />Sessies / Autofetching / Queries / Transactions / Async. Query Executions ...
Sessieloos<br />Sessie management is vies<br />
Autofetching<br />Statistischeanalyse voor lazy loading<br />Ali Ibrahim & William R. Cook<br />University of Texas<br />h...
Queries<br />Makkelijke queries maken<br />
Queries (voorbeeld 1)<br />List&lt;Order&gt; list = Ebean.find(Order.class)<br />	.join(&quot;customer&quot;)<br />	.where...
Queries (voorbeeld 2)<br />find order (orderDate, shipDate)<br />join orderDetails (*)<br />join product (sku, name)<br />...
Queries (voorbeeld 2)<br />select order.orderDate, order.shipDate,<br />	orderDetails.*, product.sku, product.name<br />fr...
Queries (voorbeeld 3)<br />@NamedQueries(value={<br />	@NamedQuery(name=&quot;bugsSummary“, query=“...&quot;),<br />	@Name...
Transactions<br />Not invented by me<br />
Async. Query Executions<br />FutureList & PagingList<br />
Async. Query Executions<br />Query&lt;Order&gt; query = Ebean.find(Order.class);<br />FutureList&lt;Order&gt; futureList =...
Async. Query Executions<br />PagingList&lt;TOne&gt; pagingList = Ebean.find(TOne.class).findPagingList(pageSize);<br />Fut...
Conclusie<br />
Fin<br />
Upcoming SlideShare
Loading in...5
×

Ebean

973

Published on

Topiconf 2009

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
973
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Aannames:Enigekennis van DatabasesJava/.net
  • IkzaljullielatenzienwatEbeaninhoudt, sommigedelenzullenbekendvoorkomen, maareenaantalaspectenzijnveelbelovend. GezienEbeannogaardig in ontwikkeling is kanikniet van elkeonderdeelalles tot in de diepteuitleggen. Maar ten eerste:
  • Is ebeansessieloos. In tegenstelling tot andere ORM pakkettenheeftebeangeensessie management. In plaatshiervanwordtditvoornamelijk in de entiteitzelfonthouden. Wanneeriemandietswijzigtweet het object zelf of het “dirty” is. Ofwel of het gewijzigd is t.o.v. de database.Watebeanwelheeft is eenpersistance context. Dezezorgtervoordatelke object maar 1 keerbestaat. Je krijgt in feitealleennieuwereferentiesnaarhetzelfde object. Dit is tovandere ORM pakettennietechtanders. De persistance context bestaat van het begin van eentransactie tot het eind van de request cycle.Eennadeel vandezeaanpak is weldatwijzigingen op properties van het entiteit van mutable types nietwordenmeegenomen. Denkhierbijaaneen Date, als je hiereen dag bijopteltwordtdit intern gedaan en niet op het entiteit. Je moetdandus de date vervangen met eennieuwe.Van sessiesgaan we naarautofetching.
  • Autofetching is een term die bedacht is door Ali Ibrahim en William Cook, zijhebbenditideeuitgewerkt in een paper waarinzeuitleggen hoe autofetchingwerkt. In het kortwerkt het door het gedrag van de applicatie live te analyseren en te kijkenwelkevelden van de opgehaaldeEnteitennodigzijn en dezeautomatisch op te halen. Ditwerkt in combinatie met zogeheten lazy objects, objecten die maargedeeltelijkzijnopgehaalduit de database omzo de round-trip tijd te verkorten.
  • APIeigen query taal named queries
  • Net als elk ander ORMkan je via een API queries bouwen, maarwanneerwenselijkkanditook via eeneigen query taal..NET mensenzullendeze method chaining herkennen van Linq, het lijkteropmaardat is danookalles.
  • // find all the orders (with orderDetails and products)// ... fetching the order id, orderDate and shipDate// ... fetching all the properties for orderDetail// ... fetching the product id, sku and name
  • Ebeanheeftzijneigentransactiemethoden@TransactionalTxRunnable en TxCallablecreateTransaction() en beginTransaction()Spring transaction support wordtaangewerkt.
  • // get the row count in the background...// ... otherwise it is fetched on demand// ... when getTotalRowCount() or getTotalPageCount()// ... is called
  • Demeesteprojectenhebben Hibernate al erg ingeburgerd en ondanksverwoedepogingen van veelontwikkelaarsomtussen de sproetjes Hibernate overalzoveelmogelijk te verwijderenzalditnooitlukken. Met proxies en met specialeactiesom de beloofde performance te halen is diteenhel.Voor nieuweprojectenzal het eenleukideezijn, zelfbenik al bezig met eenkleinprojectjeom Hibernate te verwijderen. Met maareenhandjevolentiteitenzalditniet erg moeilijkzijn, het meestezal in het onderwijs framework Cobra zitten. Hier is hibernate al knap irritant maarechtebikkelsgevenniet op.Een van de voordelenzaltochwelzijndatergeensessiebij je entiteiten is en dat je zodoende je objectenkanbewarenzoals je datzelf correct acht. Met autofetching is ebeaneengoedewegingeslagen want ditzalbijzwaresystementochweleenboelschelen.
  • Transcript of "Ebean"

    1. 1. Ebean<br />Een hibernate killer<br />Hielke Hoeve<br />TopicusOnderwijs<br />
    2. 2. Ebean<br />(Yet another) ORM implementatie<br />Sessies / Autofetching / Queries / Transactions / Async. Query Executions <br />
    3. 3. Sessieloos<br />Sessie management is vies<br />
    4. 4. Autofetching<br />Statistischeanalyse voor lazy loading<br />Ali Ibrahim & William R. Cook<br />University of Texas<br />http://www.cs.utexas.edu/~aibrahim/autofetch/<br />
    5. 5. Queries<br />Makkelijke queries maken<br />
    6. 6. Queries (voorbeeld 1)<br />List&lt;Order&gt; list = Ebean.find(Order.class)<br /> .join(&quot;customer&quot;)<br /> .where().eq(&quot;status.code&quot;, &quot;SHIPPED&quot;)<br /> .findList();<br />
    7. 7. Queries (voorbeeld 2)<br />find order (orderDate, shipDate)<br />join orderDetails (*)<br />join product (sku, name)<br />where customer.name like :custname<br />3 auto joins<br />
    8. 8. Queries (voorbeeld 2)<br />select order.orderDate, order.shipDate,<br /> orderDetails.*, product.sku, product.name<br />from order<br />left outer join orderDetails<br /> onorderDetails .order = order.id<br />left outer join product<br />on orderDetails.product = product.id<br />inner join customer<br />on customer.id = order.customer<br />where customer.name like :custname<br />
    9. 9. Queries (voorbeeld 3)<br />@NamedQueries(value={<br /> @NamedQuery(name=&quot;bugsSummary“, query=“...&quot;),<br /> @NamedQuery(name=&quot;bugStatus“, query=“...&quot;)<br />})<br />@Entity<br />@Table(name=&quot;s_user&quot;)<br />public class User implements Serializable {<br />
    10. 10. Transactions<br />Not invented by me<br />
    11. 11. Async. Query Executions<br />FutureList & PagingList<br />
    12. 12. Async. Query Executions<br />Query&lt;Order&gt; query = Ebean.find(Order.class);<br />FutureList&lt;Order&gt; futureList = query.findFutureList();<br />if (!futureList.isDone())<br /> futureList.cancel(true);<br />List&lt;Order&gt; list = futureList.get();<br />// or with a timeout<br />List&lt;Order&gt; list2 = futureList.get(30, TimeUnit.SECONDS);<br />
    13. 13. Async. Query Executions<br />PagingList&lt;TOne&gt; pagingList = Ebean.find(TOne.class).findPagingList(pageSize);<br />Future&lt;Integer&gt; futRowCount = pagingList.getFutureRowCount();<br />Page&lt;TOne&gt; page = pagingList.getPage(0);<br />List&lt;TOne&gt; pageList = page.getList();<br />int totalRows = page.getTotalRowCount();<br />
    14. 14. Conclusie<br />
    15. 15. Fin<br />

    ×