library - orm postgresql java




Che ORM di Java preferisci e perché? (7)

È una domanda piuttosto aperta. Inizierò un nuovo progetto e guarderò a diversi ORM da integrare con l'accesso al database.

Hai dei preferiti? Ci sono dei consigli da evitare?


Consiglierei di usare MyBatis . È un sottile strato su JDBC, è molto facile mappare oggetti alle tabelle e usare ancora SQL semplice, tutto è sotto il tuo controllo.


Hibernate, perché è fondamentalmente lo standard defacto in Java ed è stato una delle forze trainanti nella creazione dell'APP. Ha un supporto eccellente in primavera e quasi ogni framework Java lo supporta. Infine, GORM è un involucro molto interessante che lo circonda facendo cercatori dinamici e così via usando Groovy.

È persino stato portato su .NET (NHibernate), quindi puoi usarlo anche lì.


Ho smesso di usare gli ORM.

Il motivo non è un grande difetto nel concetto. L'ibernazione funziona bene. Invece, ho scoperto che le query hanno un sovraccarico basso e posso inserire molta logica complessa in query SQL di grandi dimensioni e spostare gran parte della mia elaborazione nel database.

Quindi considera solo l'uso del pacchetto JDBC.


Iberna, perché:

  • è stabile - è in giro da così tanti anni, non ha grossi problemi
  • detta gli standard nel campo ORM
  • implementa lo standard (JPA), oltre a dettarlo.
  • ha tonnellate di informazioni su di esso su Internet. Ci sono molti tutorial, soluzioni di problemi comuni, ecc
  • è potente: puoi tradurre un modello di oggetto molto complesso in un modello relazionale.
  • ha supporto per qualsiasi RDBMS principale e medio
  • è facile da lavorare, una volta che lo impari bene

Alcuni punti sul perché (e quando) utilizzare ORM:

  • lavori con oggetti nel tuo sistema (se il tuo sistema è stato progettato bene). Anche se si utilizza JDBC, si finirà per creare un livello di traduzione, in modo da trasferire i dati ai propri oggetti. Ma le mie scommesse sono che l'ibernazione è migliore nella traduzione di qualsiasi soluzione su misura.
  • non ti priva di controllo. È possibile controllare le cose in piccoli dettagli e, se l'API non ha alcune funzionalità remote, eseguire una query nativa e averla.
  • qualsiasi sistema di dimensioni medie o più grande non può permettersi di avere una tonnellata di domande (che si tratti di un posto o disseminate), se vuole essere mantenibile
  • se le prestazioni non sono critiche. Hibernate aggiunge un overhead delle prestazioni, che in alcuni casi non può essere ignorato.

Molti ORM sono fantastici, è necessario sapere perché si desidera aggiungere l'astrazione su JDBC. Posso consigliarti http://www.jooq.org (disclaimer: Sono il creatore di jOOQ, quindi questa risposta è di parte). jOOQ abbraccia il seguente paradigma:

  • SQL è una buona cosa. Molte cose possono essere espresse abbastanza bene in SQL. Non è necessario completare l'astrazione di SQL.
  • Il modello di dati relazionali è una buona cosa. Ha dimostrato il miglior modello di dati per gli ultimi 40 anni. Non c'è bisogno di database XML o modelli di dati veramente orientati agli oggetti. Invece, la tua azienda esegue diverse istanze di Oracle, MySQL, MSSQL, DB2 o qualsiasi altro RDBMS.
  • SQL ha una struttura e una sintassi. Non dovrebbe essere espresso usando la concatenazione di stringhe "di basso livello" in JDBC - o la concatenazione di stringhe "di alto livello" in HQL - che sono entrambi inclini a contenere errori di sintassi.
  • L'associazione variabile tende ad essere molto complessa quando si tratta di query importanti. È qualcosa che dovrebbe essere astratto.
  • I POJO sono fantastici quando si scrive codice Java che manipola i dati del database.
  • I POJO sono un dolore da scrivere e mantenere manualmente. La generazione del codice è la strada da percorrere. Avrai query sulla compilazione, inclusa la sicurezza dei dati.
  • Il database viene prima di tutto. Mentre l'applicazione in cima al tuo database può cambiare nel tempo, il database stesso probabilmente durerà più a lungo.
  • Sì, nel tuo database precedente sono presenti stored procedure e tipi definiti dall'utente (UDT). Il tuo strumento di database dovrebbe supportarlo.

Ci sono molti altri buoni ORM. Soprattutto Hibernate o iBATIS hanno una grande comunità. Ma se stai cercando una soluzione intuitiva e semplice, ti suggerisco di provare jOOQ. Ti piacerà! :-)

Dai un'occhiata a questo esempio SQL:

  // Select authors with books that are sold out
  SELECT * 
    FROM T_AUTHOR a
   WHERE EXISTS (SELECT 1
                   FROM T_BOOK
                  WHERE T_BOOK.STATUS = 'SOLD OUT'
                    AND T_BOOK.AUTHOR_ID = a.ID);

E come può essere espresso in jOOQ:

  // Alias the author table
  TAuthor a = T_AUTHOR.as("a");

  // Use the aliased table in the select statement
  create.selectFrom(a)
        .whereExists(create.selectOne()
                           .from(T_BOOK)
                           .where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
                           .and(T_BOOK.AUTHOR_ID.equal(a.ID))))));

Nessuno, perché avere un ORM richiede troppo controllo con piccoli benefici. I risparmi di tempo ottenuti vengono facilmente spazzati via quando si devono eseguire il debug delle anormalità risultanti dall'uso dell'ORM. Inoltre, gli ORM scoraggiano gli sviluppatori dall'apprendimento di SQL e di come funzionano i database relazionali e li utilizzano a loro vantaggio.


SimpleORM , perché è straight-forward e no-magic. Definisce tutte le strutture di metadati nel codice Java ed è molto flessibile.

SimpleORM offre funzionalità simili a quelle di Hibernate mappando i dati in un database relazionale agli oggetti Java in memoria. Le query possono essere specificate in termini di oggetti Java, l'identità dell'oggetto è allineata con le chiavi del database, le relazioni tra gli oggetti vengono mantenute e gli oggetti modificati vengono automaticamente scaricati nel database con i blocchi ottimistici.

Ma a differenza di Hibernate, SimpleORM utilizza una struttura e un'architettura molto semplice che evita la necessità di analisi complesse, elaborazione di byte code, ecc. SimpleORM è piccolo e trasparente, confezionato in due vasi di soli 79K e 52K di dimensione, con solo un piccolo e opzionale dipendenza (Slf4j). (Hibernate è oltre 2400K più circa 2000K di giare dipendenti.) Ciò semplifica la comprensione di SimpleORM e riduce così notevolmente il rischio tecnico.





orm