2010-08-16 13 views
5

Sé hibernar, pero me pregunto si habría un motor ORM más ligero para una base de datos de solo lectura. Quiero decir, no necesito algunas consultas transaccionales ni actualizar algunos registros. Por otro lado, necesito manejar una gran lista de registros:java ORM para solo lectura DB

List<MyRecord> list= object.getMyRecords(); // list.size() > 1E7 

¿Existe tal motor? Muchas gracias,

Pierre

+0

¿Qué hay de malo en hibernación, lo que hizo u límite de alcance para comenzar a buscar otro ORM? – Vanger

+0

No tengo nada comparado con Hibernate, pero me pregunto si existe otro ORM. Me parece que el hibernate tarda mucho tiempo en configurarse con muchas dependencias, las transacciones son inútiles (en mi caso) y me temo que no admitirá una gran cantidad de elementos en mis listas. – Pierre

+0

Para algunas clases para mapear y de solo lectura me gustaría ir con una buena biblioteca de grupo de conexiones (c3p0) y JDBC como "motor de luz". – PeterMmm

Respuesta

2

Puede consultar JIRM (sí, es un enchufe desvergonzado) que es un ORM centrado en el uso de objetos inmutables.

Se encuentra justo encima de Spring JDBC por lo que, si está utilizando Spring, es muy poco riesgo de probarlo.

También tiene muy buenas SQL placeholder templates que no requieren Spring.

Otro proyecto que debe finalizar la compra es jOOQ.

1

Si usted está buscando un marco ORM ligero, no busque más allá OrmLite. Le permite evitar la mayor parte de la sobrecarga de la configuración de marcos ORM más complicados como Hibernate. La desventaja de este marco es que no es compatible con las anotaciones JPA estándar por lo que no sería fácil cambiar este ORM por uno diferente más adelante.

Sugeriría probar OpenJPA que es un marco ORM conforme a JPA estándar mantenido por la fundación Apache. Es uno de los principales competidores de Hibernate. Tiene un poco más de sobrecarga para configurar, pero tiene la ventaja de permitirle cambiarlo en el futuro por un marco compatible con JPA diferente (como Hibernate) si ya no se ajusta a sus necesidades.

Ambos marcos son de código abierto y siempre es una buena razón para usarlos.

+0

En realidad, ORMLite admite un subconjunto de anotaciones JPA, pero no el complemento completo. – Gray

1

Busqué también lite ORM para un proyecto hace aproximadamente un año. Y probé un par de ellos. Estaba un poco insatisfecho con todas las soluciones porque cada una de ellas estaba tratando de avanzar en cierta dirección.

Hibernate es enorme y puede ser una fuente de problemas adicionales cuando se quiere una solución sencilla. Actualmente estoy trabajando en un proyecto agradable que utiliza poca capa personalizada sobre tablas.

Probablemente se puede tratar de aplicar un poco de capa por encima de su base de datos con JDBC utilizando algunos patrones como Active Record o Tabla de puerta de enlace, etc.

Cualquier solución ORM simplemente trata de ser muy colas adicionales unificados y anuncios a su proyecto . Pero puede crear su propia solución personalizada sin capas: esto funcionará especialmente bien si su base de datos tiene un conjunto predefinido de tablas y no cambia su estructura con demasiada frecuencia.

+0

¿Has mirado a jORM? https://github.com/jajja/jorm – Martin

+0

@Martin - no lo vi antes - la API de acceso se ve bien - muy similar al registro activo. Gracias por el enlace! – Vladimir

+0

Si está interesado, pruébelo y díganos sus comentarios. ¿Cuál es tu motor de base de datos de elección? – Martin

1

Tenga una mirada en Ebeans que es una herramienta ORM luz:

  • reutiliza anotaciones JPA (@Entity, @OneToMany ...) para el mapeo.
  • Utiliza una arquitectura Session Less (es decir, tiene una API más simple que JPA).
  • Admite Objeto de valor inmutables.
  • permite utilizar ORM or Relational features
  • reclamaciones para proporcionar un buen apoyo large query

Vale la pena el aspecto de la OMI.

0

SimpleJDBCTemplate de Spring combinado con los mapeadores de resultados me maravillaron en los escenarios de solo lectura, no obtiene la sobrecarga de hibernación innecesaria, todos sus mapeos pseudo-ORM están agrupados, es una verdadera victoria para tales escenarios.

1

Creo que debería considerar MyBatis (IBatis 3) ORM library. Se ajusta a los requisitos de trabajo liviano a algunas ejecuciones de lotes pesados. Por lo tanto, se adaptará muy bien a sus necesidades actuales y no le traerá mala suerte cuando necesite algún trabajo pesado de su biblioteca ORM subyacente.

0

Si está buscando un ORM liviano, le recomiendo jORM. Tenga en cuenta que mi respuesta es parcial, ya que soy uno de los contribuyentes al proyecto.

Las principales razones por las que decidieron escribir una alternativa ligera son (la necesidad de):

  • configuración Hazzlefree
  • transacción Claro definiciones
  • Gestión de la memoria y la velocidad
  • generación de código simple
  • Sintonizado a mano SQL

En resumen; desarrollo rápido.

ejemplo de configuración

DataSource dataSource = new DataSource(); 
dataSource.setDriverClassName("org.postgresql.Driver"); 
dataSource.setUrl("jdbc:postgresql://localhost:5432/moria"); 
dataSource.setUsername("gandalf"); 
dataSource.setPassword("mellon"); 

Database.configure("moria", dataSource); // now there's a named database 

Ejemplo de registro consultas

@Jorm(database="moria", table="goblins", id="id") 
public class Goblin extends Record { 
    public Integer getId() { 
     return get("id", Integer.class); 
    } 
    public void setId(Integer id) { 
     set("id", id); 
    } 
    public Integer getTribeId() { 
     return get("tribe_id", Integer.class); 
    } 
    public void setTribeId(Integer id) { 
     set("tribe_id", id); 
    } 
    public Tribe getTribe() { 
     return get("tribe_id", Tribe.class); 
    } 
    public void setTribe(Tribe tribe) { 
     set("tribe_id", tribe); 
    } 
    public String getName() { 
     return get("name", String.class); 
    } 
    public void setName(String name) { 
     set("name", name); 
    } 
} 

Ejemplo mapeado

Goblin goblin = Record.findById(Goblin.class 42); 

List<Goblin> goblins = Record.findAll(Goblin.class);Goblin bolg = Record.find(Goblin.class, new Column("name", "Bolg")); 

Ejemplo encargo consulta

Tribe tribe = new Tribe(); 
tribe.setId(1); 
String name = "Azog"; 

Goblin azog = Record.select(
    Goblin.class, 
    "SELECT * FROM goblins WHERE name = #1# AND tribe_id = #2:id#", 
    name, // #1# 
    tribe // #2# 
); 

Goblin bolg = Record.find(Goblin.class, "SELECT * FROM goblins WHERE name = #1#", "Bolg"); 
Cuestiones relacionadas