Articulo de referencia

Patrón de registro activo

En ingeniería de software , el patrón Active Record es un patrón arquitectónico . Se encuentra en software que almacena datos de objetos en memoria en bases de datos relacionale...

En ingeniería de software , el patrón Active Record es un patrón arquitectónico . Se encuentra en software que almacena datos de objetos en memoria en bases de datos relacionales . Fue nombrado por Martin Fowler en su libro de 2003, Patterns of Enterprise Application Architecture . [ 1 ] [ 2 ] La interfaz de un objeto que se ajusta a este patrón incluiría funciones como Insertar, Actualizar y Eliminar, además de propiedades que se corresponden más o menos directamente con las columnas de la tabla de la base de datos subyacente.

El patrón Active Record es una capa de acceso a datos que realiza una transferencia bidireccional de datos entre un almacén de datos persistente (a menudo una base de datos relacional ) y una representación de datos en memoria (la capa de dominio). Una tabla o vista de la base de datos se encapsula en una clase . De esta forma, una instancia de objeto se vincula a una única fila de la tabla. Tras la creación de un objeto, se añade una nueva fila a la tabla al guardarla. Cualquier objeto cargado obtiene su información de la base de datos. Cuando se actualiza un objeto, también se actualiza la fila correspondiente en la tabla. La clase envoltorio implementa métodos de acceso o propiedades para cada columna de la tabla o vista.

Este patrón es comúnmente utilizado por herramientas de persistencia de objetos y en el mapeo objeto-relacional (ORM). Normalmente, las relaciones de clave externa se exponen como una instancia de objeto del tipo apropiado a través de una propiedad.

Implementaciones

Se pueden encontrar implementaciones del concepto en varios frameworks para muchos entornos de programación. Por ejemplo, si hay una tabla partsen una base de datos con columnas name(tipo cadena) y price(tipo numérico), y el patrón Active Record está implementado en la clase Part, el pseudocódigo

Parte parte = nueva Parte ( "Parte de muestra" , 123.45 );

creará una nueva fila en la partstabla con los valores dados y es aproximadamente equivalente al comando SQL.

INSERTAR EN partes ( nombre , precio ) VALORES ( 'Pieza de muestra' , 123 . 45 );

Por el contrario, la clase se puede utilizar para consultar la base de datos:

Parte b = partes . stream () . filter ( p -> "gearbox" . equals ( p . getName ())) . findFirst () . orElse ( null );

Esto encontrará un nuevo Partobjeto basándose en la primera fila coincidente de la partstabla cuya namecolumna tenga el valor "gearbox". El comando SQL utilizado podría ser similar al siguiente, dependiendo de los detalles de la implementación SQL de la base de datos:

SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1 ; -- MySQL o PostgreSQL

Varias bibliotecas implementan un marco de patrón de registro activo, como las bibliotecas POCO C++ en la biblioteca Poco::ActiveRecord. [ 3 ]

Ejemplo

Este es un ejemplo sencillo de un objeto Active Record Useren Java . Aquí la Userclase es tanto el modelo como el objeto de acceso a datos y proporciona los métodos save(), find(), y delete().

paquete org.wikipedia.examples ;import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.sql.ResultSet ; import java.sql.SQLException ; import java.sql.Statement ;clase pública Usuario { int privado id ; cadena privada nombre ; cadena privada correo electrónico ;public User ( String name , String email ) { this . name = name ; this . email = email ; }public int getId () { return id ; }public void setId ( int id ) { this . id = id ; }public String getName () { return nombre ; }public void setName ( String name ) { this . name = name ; }public String getEmail () { return email ; }public void setEmail ( String email ) { this . email = email ; }public void save () { try ( Connection conn = DriverManager . getConnection ( "jdbc:mysql://localhost:3306/mydb" , "user" , "password" )) { if ( this . id == 0 ) { String sql = "INSERT INTO users (name, email) VALUES (?, ?)" ; try ( PreparedStatement stmt = conn . prepareStatement ( sql , Statement . RETURN_GENERATED_KEYS )) { stmt . setString ( 1 , this . name ); stmt . setString ( 2 , this . email ); stmt . executeUpdate (); ResultSet rs = stmt . getGeneratedKeys (); if ( rs . next ()) { this . id = rs . getInt ( 1 ); } } } else { String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?" ; try ( PreparedStatement stmt = conn . prepareStatement ( sql )) { stmt . setString ( 1 , this . name ); stmt . setString ( 2 , this . email ); stmt . setInt ( 3 , this . id ); stmt . executeUpdate (); } } } catch ( SQLException e ) { System . err . printf ( "Se produjo una SQLException: %s%n" , e .obtenerMensaje ()); e.imprimirStackTrace ( ) ; } }public static User find ( int id ) { try ( Connection conn = DriverManager . getConnection ( "jdbc:mysql://localhost:3306/mydb" , "user" , "password" )) { String sql = "SELECT * FROM users WHERE id = ?" ; try ( PreparedStatement stmt = conn . prepareStatement ( sql )) { stmt . setInt ( 1 , id ); ResultSet rs = stmt . executeQuery (); if ( rs . next ()) { User user = new User ( rs . getString ( "name" ), rs . getString ( "email" )); user . setId ( rs . getInt ( "id" )); return user ; } } } catch ( SQLException e ) { System . err . printf ( " Se produjo una SQLException: % s %n" , e.getMessage ()); e.printStackTrace ( ) ; } return null ; }public void delete ( ) { try ( Connection conn = DriverManager.getConnection ( "jdbc:mysql://localhost:3306/mydb" , " user " , " password " )) { String sql = "DELETE FROM users WHERE id = ?" ; try ( PreparedStatement stmt = conn.prepareStatement ( sql ) ) { stmt.setInt ( 1 , this.id ) ; stmt.executeUpdate ( ) ; } } catch ( SQLException e ) { System.err.printf ( " Se produjo una SQLException : % s%n" , e.getMessage ( ) ) ; e.printStackTrace ( ) ; } } }

Crítica

Principio de responsabilidad única y separación de intereses.

Otra crítica al patrón Active Record es que, debido al fuerte acoplamiento entre la interacción con la base de datos y la lógica de la aplicación, un objeto Active Record no sigue el principio de responsabilidad única ni la separación de responsabilidades . Esto contrasta con la arquitectura multicapa , que sí aborda adecuadamente estas prácticas. Por ello, el patrón Active Record se emplea mejor y con mayor frecuencia en aplicaciones sencillas que utilizan exclusivamente formularios sobre datos con funcionalidad CRUD , o bien como parte de una arquitectura. Normalmente, esta parte corresponde al acceso a datos, razón por la cual varios ORM implementan el patrón Active Record.

Véase también

Referencias

  1. P del catálogo de la EAA - Registro activo
  2. Fowler, Martin (2003). Patrones de arquitectura de aplicaciones empresariales . Addison-Wesley. ISBN 978-0-321-12742-6.
  3. "Espacio de nombres Poco::ActiveRecord" . docs.pocoproject.org . Proyecto POCO . Consultado el 18 de octubre de 2025 .