2009-12-31 11 views
60

Per la nostra nuova reingegnerizzazione del prodotto, stiamo selezionando la migliore infrastruttura da Java. Poiché la considerazione è quella di optare per l'approccio agnostico del database per il modello, stiamo lavorando sulle opzioni tra Struts + Spring con iBATIS o Hibernate. Si prega di consulenza che è il migliore in quanto entrambi offrono persistenza.Hibernate Vs iBATIS

risposta

164

Ibatis e Hibernate sono animali molto diversi.

Il modo in cui io tendo a guardarlo è questo: Hibernate funziona meglio se la tua vista è più object-centric. Se tuttavia si visualizza più database-centrica, Ibatis è una scelta molto più forte.

Se hai il controllo completo dello schema e non hai un requisito di throughput estremamente elevato, Hibernate può funzionare abbastanza bene. Il modello a oggetti rende il codice abbastanza comodo, ma con un costo di complessità enorme pari a .

Se si ha a che fare con uno schema di database "legacy" in cui è necessario scrivere query SQL abbastanza complicate, è probabile che Ibatis funzioni meglio.

HQL (Hibernate Query Language) è un'altra lingua che dovrai imparare e anche in questo caso probabilmente troverai i casi in cui è necessario scrivere SQL. Inoltre, è probabile che in alcuni casi trascorrerai mezza giornata a capire la giusta combinazione di XML, proprietà, annotazioni, ecc. Per far sì che Hibernate generi una query SQL performante.

Non esiste una risposta universale "A è meglio di B" per questa domanda.

+0

Per un ORM leggero e piccolo con SQL builder controllare MentaBean: http://mentabean.soliveirajr.com – TraderJoeChicago

+13

Ora 2 anni dopo, è ancora vero con l'avvento di jpa, l'ibernazione è cambiata parecchio e ibatis ora è cambiato mybatis, mi sto chiedendo quali sono le attuali opinioni delle persone là fuori. – Joelio

+0

scritto in modo chiaro .. – chaosguru

15

Cletus ha svolto un ottimo lavoro nel riassumere questo confronto. Hibernate funziona bene quando si controlla il modello dei dati ed è più incentrato sugli oggetti mentre iBATIS funziona bene quando è necessario integrarsi con un database esistente ed è più incentrato sui dati.

Inoltre, penso che Hibernate abbia un po 'più di curva di apprendimento. Con iBATIS, è abbastanza facile sapere cosa sta succedendo mentre più "magia" accade con Hibernate. In altre parole, i principianti potrebbero trovare iBatis più facili da usare e da capire.

Ma non sto dicendo che dovresti preferire iBatis, iBatis e Hibernate sono solo diversi come detto sopra.

E, a proposito, se si utilizza Hibernate, si potrebbe prendere in considerazione l'uso di annotazioni di mapping oggetto/relazionale JPA ed EJB 3.0 (JSR-220) fornite da Hibernate Annotations.

4

se si sta già utilizzando Spring, vorrei iniziare con Spring JDBC piuttosto che immergersi direttamente in Hibernate o iBatis. Se scrivi il tuo livello di persistenza in termini di interfacce, non dovresti avere problemi a cambiare le implementazioni dopo aver ottenuto Hibernate o iBatis sotto la cintura.

Non c'è motivo per cui debba essere una decisione "tutto o nessuno". Usa ciò che è meglio per la tua situazione.

+7

Spring JDBC è di gran lunga inferiore a Ibatis. Per prima cosa devi scrivere compilatori di righe (noiosi) o la mappatura dei bean di Spring è incredibilmente lenta. Non importa se stai vincolando un modulo in Spring MVC, ma lo fa sicuramente se stai restituendo migliaia di righe. Ho ridotto il tempo di esecuzione a una query da 50+ secondi a <2 semplicemente sostituendo il mapping dei bean Spring in Spring JDBC con un mapper di riga esplicito ma chi vuole scriverli? – cletus

40

Considera cosa stai cercando di ottenere. In genere, il modello Command Query Response Segregation funziona bene per domini complessi.

Il motivo è che si sta cercando di fare una delle due cose: tipicamente

  1. creare/aggiornare/eliminare alcune entità del dominio complesse
  2. Run analitica prendere query (cioè di somma/query di aggregazione)

Hibernate funziona bene per il caso 1 che consente di effettuare solo un POJO e persistono/aggiornarlo. Lo fa anche rapidamente, a meno che il tuo dominio non sia abbastanza grande.

myBatis è ottimo per le query di recupero (caso 2) in cui si desidera solo una risposta. Hibernate tenterebbe di caricare l'intero grafico dell'oggetto e avresti bisogno di iniziare a sintonizzare le query con trucchi LazyLoading per mantenerlo funzionante su un dominio di grandi dimensioni. Viceversa se si desidera una pagina POJO analitica, l'implementazione myBatis della stessa query sarebbe banale.

Per questo motivo, myBatis is faster than Hibernate su SELECTS.

Questi due casi sono la differenza tra Comandi in cui si desidera modificare i dati di dominio e risposte in cui si desidera solo per andare a prendere alcuni dati.

Quindi, considera questi due casi e ciò che fa l'applicazione. Se hai un dominio semplice e recuperi le informazioni, usa myBatis. Se hai un dominio complesso e le entità persistono, usa Hibernate. Se fai entrambe le cose, considera un approccio ibrido. Questo è quello che usiamo nel nostro progetto che ha migliaia di entità per tenerlo sotto controllo. ;)

4

Hibernate è un ORM, che significa (al livello più elementare) associa istanze di oggetti java a righe effettive in una tabella di database. Generalmente, per i pojo recuperati tramite Hibernate: qualsiasi manipolazione e modifica a questi pojo apparirà nel database. Hibernate genererà ed eseguirà l'SQL pertinente al momento opportuno.

Mybatis (al livello più elementare) è semplicemente uno strumento per riattaccare ed eseguire SQL archiviato in file xml. Non associa istanze di oggetti Java a righe in una tabella di database, ma associa i metodi Java a istruzioni SQL e pertanto non è un ORM. Può anche restituire poos, ovviamente, ma non sono legati a nessun tipo di contesto di persistenza.

Entrambi gli strumenti fanno molto più di quanto descritto sopra, ma uno è un ORM e uno no.

I criteri per consentire all'utente di scegliere quale utilizzare, credo, dipende in modo critico dal modello di database con cui si deve lavorare.

Ad esempio, immaginare un grande schema tentacolare, che rappresenta un modello assicurativo. Gli sviluppatori sono tenuti a recuperare i dati e interagire con tali dati in un modo che soddisfi l'azienda in questione.

Developer venire su Go, e non avrebbe mai essere tenuti ad avere la conoscenza del business requisito per scrivere tutto SQL a mano (che Mybatis richiederebbe). L'ibernazione andrebbe bene per uno scenario del genere.

Gli analisti aziendali definiscono la datamodel, le entità, le relazioni e le interazioni, come è la loro esperienza. Gli sviluppatori Java utilizzano quindi Hibernate per "camminare sul modello". Gli sviluppatori di business possono diventare molto produttivi rapidamente senza la necessità di scrivere sql incline a errori complessi per l'esecuzione su uno schema molto complicato.

Nella mia esperienza, sia Hibernate che Mybatis vengono utilizzati regolarmente nello stesso progetto.

Dove Hibernate viene utilizzato per

  • funzionalità generale CRUD
  • 'Camminare' l' 'oggetto di dominio' modello relazionale
  • gestione delle sessioni

e dove Mybatis viene utilizzato per

  • ad hoc interroga
  • kick off (e interagire con) le stored procedure
  • query
  • supporto molto specifici o complessi
  • supporto query di ricerca complessa, in cui i criteri di ricerca è dinamico, e paging dei risultati
5

ORM vs quadro di persistenza

Hibernate è un ORM (Object-Relay Mapping Framework) che associa le classi Java alle tabelle del database. MyBatis è un framework di persistenza, non ORM. Associa le istruzioni SQL ai metodi Java.

schema di database

Hibernate in grado di creare lo schema del database in base al modello di Java mentre MyBatis non ha tale caratteristica. Relative discussioni:

Cache

Hibernate ha cache di primo livello che è impossibile da disattivare. Significa che se si esegue una query su un oggetto tramite ORM e quindi lo si elimina direttamente con SQL, rimane nella cache. È possibile cancellare esplicitamente la cache per ottenere i risultati più aggiornati dal database. Relative discussioni:

gestione blocco Ottimista

Inoltre ci sono differenze per la gestione di blocco ottimistico:

MyBatis non supporta ottimista controllo della concorrenza ic nativo, a differenza degli strumenti ORM come Hibernate/JPA con l'annotazione @Version.

discussioni correlate:

caricamento pigro

Hibernate cercherà di caricare intero grafo oggetto tranne oggetti contrassegnati per lazy loading . myBatis caricherà i dati in base a una query SQL. Il caricamento lento può migliorare le prestazioni ma potrebbe causare perdite di connessione se utilizzato con le proprietà <property name="hibernate.enable_lazy_load_no_trans" value="true" /> . Relative discussioni:

gestione Hibernate Session

Entità operazioni come il salvataggio, l'aggiornamento o la cancellazione sono eseguite tramite Hibernate Session. Richiede una buona comprensione di come implementare la corretta strategia di gestione di Hibernate Session per evitare detached entity passed to persist e altri fenomeni relativi a Hibernate.

A volte può essere necessario più tempo per capire il comportamento di Hibernate sottostante piuttosto che aggiungere un po 'più di lavoro e scrivere istruzioni SQL raw per myBatis.

cascata

Hibernate fornisce a cascata, la rimozione orfani e altre funzionalità per i grafici degli oggetti, mentre non presente in myBatis - per la loro attuazione avrete bisogno di scrivere query SQL in modo esplicito.

query

In myBatis bisogna scrivere query SQL quasi crude. Hibernate ha più opzioni per formare una query: SQL, HQL, Criteria API. A volte può essere opportuno utilizzare l'API Criteria quando si hanno molti campi facoltativi nei criteri. Fornirebbe un approccio più strutturato per formare la query e forse evitare errori correlati.