2009-05-05 15 views
7

Devo iniziare un progetto di medie dimensioni in Java, ma non sono un grande fan degli ORM in generale, quindi la domanda è: dovrei progettare il progetto con un ORM in mente (per un uso successivo) o no?ORM: Sì o no?

L'RDBMS è Oracle 10g e le query saranno molto accoppiate a sintassi/funzioni Oracle (vale a dire testo, mining, CONNECT BY, ecc.).

Grazie mille.

risposta

10

Si potrebbe desiderare di guardare a questo problema in precedenza che discute il vantaggio di ORM: What are the advantages of using an ORM?

La parte più rilevante (tratto dalla risposta accettata):

Se avete complessa, a mano sintonizzato SQL, non c'è molto senso nell'uso di un ORM .

Se si raggiunge costantemente l'ORM e si scrive il proprio SQL, l'ORM potrebbe finire per intromettersi.

+0

Che cosa significa "complesso, SQL sintonizzati a mano" significa? Pensavo che l'ORM potesse gestire tutto ciò che potevi fare in SQL. – johnny

+0

Un ORM è in grado di gestire * qualsiasi cosa * che si possa fare in SQL, in particolare quando si considera un SQL specifico (in questo caso Oracle). Se è necessario utilizzare le funzionalità specifiche di Oracle, è probabile che sia necessario scrivere almeno alcune delle query in SQL piuttosto che il linguaggio di query dell'oggetto ORM. –

+0

I luoghi più comuni in cui ho dovuto raggiungere oltre l'ORM e scrivere il mio SQL sono stati rapporti. Alcuni rapporti possono diventare piuttosto complessi, e non penso che nessun ORM usi ancora PIVOT. – Min

1

Dipende ...

E non c'è bisogno di usare un ORM per ogni accesso DB ...

5

Poiché Im non ha permesso di commentare il tuo post commento Ill come questo (la mancanza di punti).

Sarebbe bene per la discussione perché non ti piace ORM.

Imo, ci andrei. E se per qualche ragione trovi una query che è lenta dall'ORM, allora la farei anch'io. Solo perché tu usi un ORM la maggior parte delle tue attività non significa che devi usarla per tutti. Ma sì, sarebbe preferibile.

3

Un altro vantaggio con un ORM è che sarà molto buono sul tuo CV. La maggior parte dei lavori pubblicizzati oggi (almeno gli sviluppatori Java) richiedono una certa conoscenza degli ORM. Quindi, se hai la possibilità di lavorare su un progetto, scegliere Spring e Hibernate in quanto aumenterà davvero il tuo CV.

Ho pensato che il collegamento all'altra domanda riguardasse piuttosto bene i benefici tecnici, quindi non dirò nulla su di loro.

+0

È un buon punto. –

+7

Così eliminando lo "sviluppatore Oracle hard core" ed essendo in grado di articolare il motivo per cui in alcune situazioni non si vuole in realtà astrarre il motore di database da $ 10.000 per CPU che si sta utilizzando nel caso in cui si desideri scambiarlo per sqlite3. –

1

Sì. Gli ORM possono essere molto onerosi da uno sviluppatore di app; per lo meno, progettare pensando a loro non dovrebbe aggiungere molto peso al design e può aiutare in modo significativo in futuro se si decide di utilizzare un ORM.

1

Come altri hanno menzionato; se si dipende fortemente dal DB (relazionale), gli ORM danno poco e aggiungono solo un'astrazione non utile. Ma soprattutto: vuoi (vuoi) gestire i dati come Oggetti o no? Se sì, gli ORM sono progettati per questo. Altrimenti, perché preoccuparsi. E se è possibile aggiungere ORM in seguito, se necessario, potrebbe richiedere un po 'di tempo in più rispetto a quello iniziale, ma fare il contrario (eliminare l'ibernazione dopo averlo disturbato ...) è molto peggio.

Ma ci sono anche differenze tra gli ORM; iBatis potrebbe essere più adatto di Hibernate, ad esempio (ci sono altre domande per questo particolare argomento).

5

Personalmente li ho trovati (beh, Hibernate) per essere un incredibile spreco di tempo. Lungi dal risparmiare tempo, ho passato troppo tempo a cercare di capire cosa diavolo sta facendo sotto le coperte.Come altri hanno già detto, se il tuo modello di dati cresce oltre una certa complessità, avere un altro livello tra te e il DB crea solo più frizione. Se il tuo modello di dati non è così complesso, beh, allora non hai davvero bisogno dell'ORM.

I do consiglia di avere una sorta di astrazione per mantenere SQL fuori dal codice Java, ma ciò può essere fatto semplicemente con un livello DAO e file di proprietà o qualsiasi altra cosa. Anche strumenti come IBATIS o Spring JDBC possono essere utili, dal momento che è ancora possibile scrivere le proprie query, e basta usare il framework per aiutare con tutto il codice boilerplate per mischiare i dati tra JDBC e gli oggetti del modello.

PS: divertente nota a margine. Nel mio ufficio abbiamo in realtà una foto incorniciata di Gavin King che tutti noi malediciamo in effigie. "Ehi, è il tuo turno per affrontare il problema di Hibernate di oggi, quindi ecco Gavin." :-)

+0

Questo è esattamente come mi sento. Hibernate introduce più problemi in sé di quanti ne risolva. JDBC con SQL Builder è la strada da seguire nel mio parere personale. Dai un'occhiata a questo leggero ORM con SQL builder: http://mentabean.soliveirajr.com – TraderJoeChicago

2

Un ORM disaccoppia intenzionalmente gli oggetti di lavoro dal database, creando un'astrazione (inevitabilmente con perdite). Quindi ti ritroveresti a scavare nel tunnel per ripristinare ciò che avevi eliminato intenzionalmente.

Se molte delle applicazioni sono intenzionalmente implementate nel database, un ORM aggiunge solo rumore al segnale e attenua il segnale.

1

OR-mapping può effettivamente essere un problema per l'SQL specifico del database. Tuttavia, alcuni concetti di mappatura OR sono molto potenti e renderanno più semplice l'interazione con il database. Alcuni di questi concetti comuni a molti OR-mapper sono:

  • Generazione di codice per lo schema del database.
  • tipo di sicurezza (da alcuni ORM)
  • più robusti gli errori di sintassi SQL variabile vincolante rispetto a quello fornito da JDBC
  • composizione SQL da oggetti per evitare

Un buon strumento per il vostro compito potrebbe essere http://jooq.sourceforge.net , che consente di creare qualsiasi SQL desiderato (inclusi selezioni annidate, unioni, join complessi, aliasing, stored procedure, UDT, ecc.)

3

Personalmente preferisco essere il più vicino possibile a SQL, quindi utilizzerei iBatis , JOOQ o MentaBean. MentaBean offre comunque un approccio il più vicino possibile a SQL e allo stesso tempo offre un grande aiuto con il codice JDBC boilerplate.

1

ORM: Sì, per qualsiasi software aziendale simile, in cui i dati sono complessi ... livelli multipli, tabelle, livelli ... Ma anche qui è consigliabile un buon mix di NHibernate ed EF6 e viste del database.

No per le app speciali. come la misurazione e dove è necessario salvare davvero un sacco di dati, ma senza la complessità dei dati


Con ORM ci sono molteplici possibilità, tutto dipende ciò che si desidera.

Come un vero e proprio mapping ORM sono fermamente recomment NHibernate e Fluent NH mappature. Hai bisogno di molte ricerche per mettere insieme una bella architettura, ma poi niente ti ostacola. Con minimi compromessi si ottiene una reale flessibilità.

EF6x (il core non è pronto all'IMHO) viene chiamato un ORM, ma ciò che genera è più vicino a un DAL. Ci sono alcune cose che non puoi fare efficacemente con EF6. Eppure, questo è il mio strumento preferito per un modello di lettura, mentre lo combino con NHibernate (dove l'NH utilizzo per un modello DDD/scrittura).

Ora a prestazioni - è sempre pro e contro. Se approfondisci l'architettura di ORM (vedi il mio articolo: avoid ORM bad habits), troverai intuitivamente i modi per renderlo più veloce. Ecco il mio altro articolo su come fare EF6x 5x più veloce (almeno per situazioni di lettura): EF6.x 5x faster