Como JPA (o presumiblemente primavera), Hibernate herramientas «ingeniería inversa» puede generar POJOs (Plain Old Java Objects) de las tablas de bases de datos y viceversa. Generación de tablas de la base de código de Java es probablemente el más utilizado como un atajo por una sola vez, adecuado para prototipado rápido. Porque todo en una aplicación depende de la base de datos (y no viceversa), cambios en el futuro deben hacerse en la primera base de datos (y los datos existentes emigraron allí en primer lugar también), después se propagan a todas las partes afectadas de la aplicación.
He descubierto que todo lo que el proceso de «ingeniería inversa de bases de datos» no genera para mí se rompe, por lo general, más temprano que tarde. Además de que la parte más difícil de la gestión del mantenimiento de un sistema grande es la refactorización constante. Para ello, he desarrollado 2 goles para el proceso de ingeniería inversa de bases de datos:
- Debe mantener mi aplicación en sintonía con los cambios de base de datos, la actualización de forma automática tanto de mi solicitud como sea práctico. .
- Donde # 1 no es posible, se debe hacer que las áreas afectadas de mi aplicación para generar un error en tiempo de compilación
Imagina una tabla de base de datos:
CREATE TABLE `usuario` (
bigint `id` (20) unsigned NOT NULL AUTO_INCREMENT,
`last_modifier_id` bigint (20) sin firmar NULL DEFAULT,
`company_id `bigint (20) unsigned NOT NULL,
` identificador `varchar (64) NO COMMENT NULL 'PIN. único dentro de una empresa",
`first_name_c` varchar (40) NULL DEFAULT,
herramientas, etc
generación de bases de datos que normalmente generan la siguiente clase de campos:
public class Usuario implementa java.io.Serializable {
Identificación privada de largo;
lastModifier usuario privado;
empresa Empresa privada;
identificador private String;
private String firstNameC;
etc
getId larga público () {id return;}
public void setId (largo x) {id = x;}
Usuario pública getLastModifier () {return lastModifier;}
public void setLastModifier (User x) {lastModifier = x;}
pública Empresa getCompany () {empresa return;}
public void setCompany (Compañía x) {x = empresa;}
public String getIdentifier () {identificador return;}
public void setIdentifier (String x) {identificador = x;}
public String getFirstNameC () {return firstNameC ;}
public void setFirstNameC (String x) {firstNameC = x;}
etc
he modificado el generador para generar también los siguientes campos para cada columna en la tabla (con el prefijo SQL_) y para cada campo en el objeto Java (con el prefijo HQL_):
público Cuerdas SQL_userúltimo tramo = "o"> = "usuario" ; / / mesa nombre
público estática definitiva Cuerdas SQL_ID = "id" ;
públicos estática definitiva Cuerdas SQL_last_modifier_id = "last_modifier_id" ;
público estática definitiva Cadena SQL_company_id = " company_id " ;
público estática final de Cadena SQL_identifier = " identificador " ;
público estática definitiva Cuerdas SQL_first_name_c = "first_name_c" ;
etc .
público estática última Cuerdas HQL_User = "Usuario" ; / / clase nombre
público estática última Cuerdas HQL_id = "id" ;
público estática Cuerdas HQL_lastModifier definitiva> = "lastModifier" ;
públicos estática definitiva Cuerdas HQL_company = "compañía" ;
público estática definitiva Cadena HQL_identifier = " identificador " ;
público estática última Cuerdas HQL_firstNameC = " firstNameC " ;
etc .
Esto me permite escribir código como el siguiente:
Crit dupIdentCrit = Crit.create (User . clase);
dupIdentCrit.add (Restrictions.eq (User.HQL_company, this));
dupIdentCrit.add (Restrictions.eq (User.HQL_identifier, identificador));
List dupIdentifierUsers = dupIdentCrit.list ();
He aquí un ejemplo de la construcción de una sentencia SQL para su uso con JDBC:
StringBuilder sqlB = new StringBuilder ( "select * from" + User.SQL_user +
"donde" + User.SQL_company_id +
"=?");
if (includeDeleted) {
sqlB.append (! "y" + User.SQL_is_deleted + "es falso");}
sqlB.append ("orden" + User.SQL_last_name_c + "," +
User.SQL_first_name_c + ", "+
User.SQL_middle_name_c);
Cuando los cambios de base de datos y que la reconstrucción de mis objetos, recibo errores de tiempo de compilación, mostrándome cada pieza de código que tengo que arreglar.
Estoy trabajando en la modificación del generador para generar también la siguiente información para todos los campos varchar o char porque su longitud máxima se define en las columnas de base de datos:
público static final int MAX_identifier = 64;
público static final int MAX_firstNameC = 40;
etc
Estoy considerando análisis sintáctico comentarios sobre cada columna para buscar algo como: 'min: 6'
y generar lo siguiente de lo siguiente:
int public static final MIN_identifier = 6;
Esa misma técnica podría ser utilizada con columnas int para definir los valores mínimos y máximos que se podrían utilizar en la validación, en la GUI, y en la ayuda de un appliction. También estoy experimentando con el uso de las fichas HQL_ como los nombres de los campos de entrada en las pantallas de la GUI .
No estoy seguro de cómo o incluso si esto iba a funcionar con procedimientos almacenados.
Un agradecimiento especial a J. Michael Greata, cuyo interés y sugerencias en los últimos años han animado y forma el desarrollo de este proyecto. Además de Arash Tavakoli cuyo puesto en el grupo de LinkedIn Java Arquitectos me inspiró a organizar mis pensamientos en este anuncio.