Sluimerstand versus iBATIS

Voor de re-engineering van onze nieuwe producten zijn we bezig met het selecteren van het beste framework uit Java. Aangezien de overweging is om voor een database-agnostische benadering voor het model te gaan, werken we aan opties tussen Struts + Spring met iBATIS of Hibernate. Geef advies wat het beste is, want beide bieden doorzettingsvermogen.


Antwoord 1, autoriteit 100%

iBATIS en Hibernate zijn nogal verschillende beesten.

De manier waarop ik ernaar kijk is als volgt: Slaapstand werkt beter als je weergave meer objectgerichtis. Als uw weergave echter meer databasegerichtis, dan is iBATIS een veel sterkere keuze.

Als je je schema volledig onder controle hebt en geen extreem hoge doorvoervereiste hebt, kan Hibernate best goed werken. Het objectmodel zorgt voor redelijk handige code, maar tegen enormecomplexiteitskosten.

Als je te maken hebt met een “legacy” databaseschema waarbij je vrij gecompliceerde SQL-query’s moet schrijven, dan is de kans groot dat iBATIS beter zal werken.

HQL (Hibernate Query Language) is een andere taal die je moet leren en zelfs dan zul je waarschijnlijk gevallen tegenkomen waarin je nogSQL moet schrijven. Bovendien is de kans groot dat je soms een halve dag bezig bent met het uitzoeken van de juiste combinatie van XML, eigenschappen, annotaties, enz. om Hibernate een performante SQL-query te laten genereren.

Er is geen universeel ‘A is beter dan B’-antwoord voor deze vraag.


Antwoord 2, autoriteit 27%

Overweeg wat u probeert te bereiken. Doorgaans is de Scheiding opdrachtquery-antwoorden
model werkt goed voor complexe domeinen.

De reden is dat je een van de volgende twee dingen probeert te doen:

  1. Een aantal complexe domeinentiteiten maken/bijwerken/verwijderen
  2. Analytische ophaalquery’s uitvoeren (d.w.z. sommatie-/aggregatiequery’s)

Sluimerstandwerkt goed voor geval 1, zodat u gewoon een POJO kunt maken en deze kunt volhouden/bijwerken. Het doet dit ook snel, tenzij uw domein vrij groot is.

myBatisis geweldig voor ophaalverzoeken (geval 2) waar u alleen een antwoord wilt. Hibernate zou proberen de hele objectgrafiek te laden en je zou zoekopdrachten moeten afstemmen met LazyLoading-trucs om het op een groot domein te laten werken. Omgekeerd, als je gewoon een analytische POJO-pagina wilt, zou de myBatis-implementatie van dezelfde zoekopdracht triviaal zijn.

Hierdoor is myBatis sneller dan Hibernatebij SELECTS.

Deze twee gevallen zijn het verschil tussen Opdrachtenwaarbij u de domeingegevens wilt wijzigen en Reactieswaarbij u alleen wat gegevens wilt ophalen.

Dus, overweeg deze twee gevallen en wat uw toepassing doet. Als je een eenvoudig domein hebt en alleen informatie ophaalt, gebruik dan myBatis. Als u een complex domein en persistente entiteiten hebt, gebruikt u Hibernate. Als u beide doet, overweeg dan een hybride aanpak. Dat gebruiken we in ons project dat duizenden entiteiten heeft om het onder controle te houden. 😉


Antwoord 3, autoriteit 13%

ORM versus persistentiekader

Hibernate is een object-relation mapping framework (ORM) dat Java-klassen toewijst aan databasetabellen. MyBatis is een persistentieraamwerk – niet ORM. Het koppelt SQL-instructies aan Java-methoden.

Databaseschema

Hibernate kan databaseschema’s maken of valideren volgens uw Java-model, terwijl MyBatis een dergelijke functie niet heeft. Het is ook handig voor het testen van de omgeving wanneer u in-memory DB gebruikt. Gerelateerde discussies:

Cache

Sluimerstand heeft een cache van het eerste niveau die onmogelijk kan worden uitgeschakeld. Het betekent dat als u een item via ORM opvraagt ​​en het vervolgens rechtstreeks met SQL verwijdert, het in de cache blijft. U kunt de cache expliciet wissen om de meest bijgewerkte resultaten uit de database te krijgen. Gerelateerde discussies:

Optimistisch slotbeheer

Er zijn ook verschillen voor optimistisch slotbeheer:

MyBatis biedt geen native ondersteuning voor optimistische gelijktijdigheidscontrole,
in tegenstelling tot ORM-tools zoals Hibernate/JPA met de @Version-annotatie.

Verwante discussies:

Lazy loading

Hibernate zal proberen de hele objectgrafiek te laden, behalve objecten die zijn gemarkeerd voor lui laden. myBatis zal gegevens laden volgens een SQL-query. Lui laden kan de prestaties verbeteren, maar het kan verbindingslekken veroorzaken als het wordt gebruikt met:
<property name="hibernate.enable_lazy_load_no_trans" value="true" />
eigenschappen. Gerelateerde discussies:

Sessiebeheer in slaapstand

Bewerkingen van entiteiten zoals opslaan, bijwerken of verwijderen worden uitgevoerd via Hibernate Sessie. Het vereist een goed begrip van het implementeren van de juiste Hibernate Session-beheerstrategie om te voorkomen dat detached entity passed to persisten andere fenomenen die verband houden met Hibernate.

Soms kan het meer tijd kosten om het onderliggende Hibernate-gedrag te begrijpen dan wat meer werk en het schrijven van onbewerkte SQL-instructies voor myBatis.

Cascaderen

Hibernate biedt trapsgewijze, weesverwijdering en andere functies voor objectgrafieken terwijl ze niet aanwezig zijn in myBatis – om ze te implementeren moet u expliciet SQL-query’s schrijven.

Vragen

In myBatis schrijf je bijna gewone SQL-query’s. Hibernate heeft meerdere opties om een ​​query te vormen: SQL, HQL, Criteria API. Soms kan het geschikt zijn om de Criteria API te gebruiken wanneer u veel optionele velden in criteria heeft. Het zou een meer gestructureerde benadering bieden voor het invullen van formulieren en misschien gerelateerde fouten voorkomen.


Antwoord 4, autoriteit 10%

Cletus heeft deze vergelijking uitstekend samengevat. Hibernate werkt goed wanneer u het gegevensmodel beheert en is meer objectgericht, terwijl iBATIS goed werkt wanneer u moet integreren met een bestaande database en meer gegevensgericht is.

Ik denk ook dat Hibernate een beetje meer leercurve heeft. Met iBATIS is het vrij eenvoudig om te weten wat er aan de hand is, terwijl er meer “magie” gebeurt met Hibernate. Met andere woorden, nieuwelingen vinden iBatis misschien gemakkelijker te gebruiken en te begrijpen.

Maar ik zeg niet dat je de voorkeur moet geven aan iBatis, iBatis en Hibernate zijn gewoon anders dan hierboven vermeld.

En trouwens, als je voor Hibernate kiest, overweeg dan misschien om gestandaardiseerde JPA- en EJB 3.0 (JSR-220) object-/relationele mapping-annotaties te gebruiken die worden geleverd door Annotaties in slaapstand.


Antwoord 5, autoriteit 4%

Hibernate is een ORM, wat betekent dat het (op het meest basale niveau) instanties van Java-objecten toewijst aan daadwerkelijke rijen in een databasetabel. Over het algemeen geldt voor pojo’s die zijn opgehaald via Hibernate: alle manipulaties en wijzigingen aan deze pojo’s verschijnen in de database. Hibernate zal de relevante SQL op een geschikt moment genereren en uitvoeren.

Mybatis (op het meest basale niveau) is gewoon een hulpmiddel voor het samenstellen en uitvoeren van SQL die is opgeslagen in xml-bestanden. Het wijst geen instanties van Java-objecten toe aan rijen in een databasetabel, maar wijst Java-methoden toe aan SQL-instructies, en daarom is het geen ORM. Het kan natuurlijk ook pojo’s retourneren, maar ze zijn niet gebonden aan enige vorm van persistentie-context.

Beide tools doen veel meer dan hierboven beschreven, maar de ene is een ORM en de andere niet.

De criteria op basis waarvan u kunt kiezen welke u wilt gebruiken, hangt volgens mij sterk af van het databasemodel waarmee u moet werken.

Stel je bijvoorbeeld een groot, uitgestrekt schema voor, dat een of ander verzekeringsmodel vertegenwoordigt. Ontwikkelaars zijn verplicht om op te halen
gegevens en interactie met die gegevens op een manier die past bij het betreffende bedrijf.

Ontwikkelaars komen en gaan en er wordt nooit verwacht dat ze over de vereiste zakelijke kennis beschikken om alleste schrijven
de sql met de hand (die Mybatis zou vereisen). Hibernate zou geschikt zijn voor een dergelijk scenario.

Business analisten definiëren het datamodel, de entiteiten, de relaties en de interacties, net als hun expertise.
Java-ontwikkelaars gebruiken vervolgens Hibernate om “het model te volgen”. De business developer kan erg productief worden
snel zonder de noodzaak om ingewikkelde foutgevoelige sql te schrijven om op een zeer gecompliceerd schema te draaien.

In mijn ervaring worden zowel Hibernate als Mybatis regelmatig gebruikt voor hetzelfde project.

Waar wordt Hibernate voor gebruikt

  • Algemene C.R.U.D-functionaliteit
  • ‘Lopen’ het relationele model ‘domeinobject’
  • Sessiebeheer

en waar Mybatis voor wordt gebruikt

  • ad-hocvragen
  • start (en interactie met) opgeslagen procedures
  • ondersteunt zeer specifieke of ingewikkelde vragen
  • ondersteunt gecompliceerde zoekopdrachten, waarbij zoekcriteria dynamisch zijn, en het pagineren van resultaten

Antwoord 6, autoriteit 3%

Als je Spring al gebruikt, zou ik beginnen met Spring JDBC in plaats van meteen in Hibernate of iBatis te duiken. Als je je persistentieniveau schrijft in termen van interfaces, zou je geen probleem moeten hebben om van implementatie te wisselen nadat je Hibernate of iBatis onder je riem hebt gekregen.

Er is geen reden waarom het een “alles of niets”-beslissing moet zijn. Gebruik wat het beste is voor uw situatie.

Other episodes