JPA vs Spring JdbcTemplate


Para un nuevo proyecto es JPA siempre la herramienta recomendada para el manejo de datos relacionales o hay escenarios donde Spring JdbcTemplate es una mejor opción? Algunos factores a considerar en su respuesta:

  • nuevo esquema de base de datos vs esquema y tablas preexistentes
  • nivel de experiencia del desarrollador
  • facilidad con la que se puede integrar con una capa de almacenamiento en caché de datos
  • rendimiento
  • ¿algún otro factor relevante a considerar?
Author: Sean Patrick Floyd, 2011-01-01

5 answers

Utilice Spring JdbcTemplate si no desea acceder a su esquema de base de datos a través de un modelo de dominio. Al usar JdbcTemplate, está utilizando un acceso de nivel inferior, con más flexibilidad, pero probablemente también más repetitivo.

Spring JdbcTemplate se puede usar más fácilmente con esquemas de bases de datos exóticos y un enfoque de procedimiento almacenado. Con JPA, debe asegurarse de que el esquema de base de datos se asigna correctamente al modelo de dominio.

Ambas tecnologías necesitan desarrolladores que conozcan bases de datos relacionales, SQL y transacciones. Sin embargo, con JPA obtienes más complejidad oculta.

JPA es que yo sepa más fácilmente conectable a las capas de almacenamiento en caché de datos, ya que el enfoque orientado a objetos facilita la identificación, actualización e invalidación de las entradas de caché.

Puede ajustar mejor los motores basados en JdbcTemplate, pero en la mayoría de los casos hay más código involucrado.

Otro aspecto a tener en cuenta es que aunque con JPA obtiene un modelo de dominio para su esquema de base de datos, a menudo necesitará usar clases DTO adicionales. Utilizando JdbcTemplate puedes operar directamente con clases DTO.

 94
Author: Timo Westkämper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-01 12:58:17

Llego un poco tarde a este post, pero tiendo a usar JdbcTemplate sobre OR. Conozco SQL (bastante bien) y realmente no quiero ser "abstraído" lejos de mi base de datos. Me parece que la mayoría de las veces, mis aplicaciones están utilizando vistas de base de datos donde empuje la mayoría de la lógica de negocios hasta. Tengo DAOs con capas adecuadas que tienen implementaciones JdbcTemplate. Se siente" limpio " y la mayoría del código repetitivo está oculto por JdbcTemplate (y su documentación en línea parece mucho mejor que las cosas OR). El tiempo limitado que he usado algo como Hibernar, descubrí cuando funcionó, me ahorró algo de tiempo...pero cuando no funcionaba correctamente, me costó días de depuración "WTF". Nunca he tenido que pasar más de 20 minutos depurando JdbcTemplate DAO impls. Creo que la clave, como otros señalaron, es lo cómodo que está con el diseño SQL / Schema

 43
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-27 01:49:35

Estoy de acuerdo con @Timo. La única otra visión que añadiría / ampliaría es que OR tiene una semántica diferente del acceso sql puro a sus datos.

El objetivo de OR es abstraer el hecho de que sus datos están en una base de datos, tanto como sea posible. Cuando se utiliza properly correctamente, todas las operaciones de persistencia se tratan en una (con suerte) capa delgada. Sus objetos modelo tendrán poco o ningún código de persistencia; el hecho de que esté utilizando OR debe ser invisible para su modelo.

Debido a esto, OR es muy bueno para facilitar su vida para ciertos tipos de operaciones, a saber, operaciones simples CRUD. Puede cargar los objetos de su modelo, presentarlos, actualizarlos, eliminarlos con bastante facilidad. Le hace la vida más fácil porque cuando accede a sus datos, obtiene objetos de modelo de vuelta, en los que puede escribir lógica de negocio. Si utiliza JDBC, tendrá que 'hidratar' sus instancias de objetos a partir de los datos, lo que puede ser complicado y propenso a errores.

OR es no siempre la mejor opción. JPA es una herramienta para un trabajo, si la herramienta no es suficiente para el trabajo, querrá encontrar una mejor herramienta. Por ejemplo, tuve un escenario en el que tuve que copiar un gráfico de objetos completo y guardar una nueva copia de esos objetos. Si había usado OR (como traté de hacer), tenía que cargar todos los objetos de la base de datos, luego copiarlos y luego guardar los nuevos objetos. Tardé demasiado.

La mejor solución era simplemente usar operaciones basadas en jdbc e' insertar a través de select ' sql llamadas para crear las nuevas filas. Era rápido, el código era más simple.

La otra cosa a considerar es que se siente cómodo con JDBC, y tiene plazos, no tiene que subirse al carro OR. Las clases Spring JdbcTemplate son extremadamente potentes y útiles. A veces la mejor herramienta para el trabajo es la que conoces. Debe familiarizarse con OR, pero no necesariamente para un proyecto con altas expectativas. Hay mucho que aprender, y no es trivial, realmente usted están negociando un conjunto de complejidades con otro en la elección de usar jdbc vs or.

 34
Author: hvgotcodes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-26 23:25:36

No se menciona en las otras respuestas, pero está bien usar ambas. En mi Aplicación utilizo JPA y JdbcTemplate, para operaciones de tipo crud utilizo JPA pero para informes o donde es más fácil utilizo JdbcTemplate.

@Repository
public class FooRepository
{
    @PersistenceContext
    private EntityManager entityManager;

    @Autowired(required = true)
    private JdbcTemplate jdbcTemplate;

    public void saveFoo(Foo foo)
    {
         this.entityManager.persist(foo);
    }

    public List<SomeReportPojo> getSomeReport()
    {
         return this.entityManager.queryForList("SELECT .. ",SomeProjectPojo.class); 
    }
}

Lo bueno de Spring es que la traducción de excepciones de JPA a spring Dao exception hierarchy funciona tanto con JPA como con JdbcTemplate. Así que use JPA cuando tenga sentido y JdbcTemplate cuando tenga sentido.

 22
Author: ams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-14 22:57:22

En el trabajo usamos Hibernate JdbcTemplate porque tiene más flexibilidad. También tiene un mejor rendimiento que JPA porque no está "cargando" muchos datos innecesarios en su aplicación.
En el caso de JdbcTemplate, sus habilidades SQL van un largo camino en darle exactamente lo que necesita a la velocidad correcta.

 5
Author: user3131171,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-22 04:59:55