miércoles, 13 de mayo de 2015

Using @GeneratedValue with Firebird and JPA (EclipseLink)

If you need to manage generated values in a Java application that uses JPA (Java Persistence API) and FirebirdSQL as database you can use @GeneratedValue annotation according to EclipseLink.

All you need to do is follow these steps:

1. Create your FIREBIRD generator

-- create your generator
CREATE GENERATOR GEN_ORDER;
SET GENERATOR GEN_ORDER TO 0;

If you are using FirebirdSQL 2.0 you can use CREATE SEQUENCE http://www.firebirdsql.org/refdocs/langrefupd20-create-seq.html

-- For Firebird 2.x
CREATE SEQUENCE GEN_ORDER;
ALTER SEQUENCE GEN_ORDER RESTART WITH 0;



2.Use @SequenceGenerator and   @GeneratedValue in your Entity class

  • Specify a name for your Sequence
     @SequenceGenerator( name = "YOUR_SEQUENCE_NAME", sequenceName = "YOUR_GENERATOR", allocationSize = 1 )
  • Use GeneratedValue and assign previous name to generator property
 @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "YOUR_SEQUENCE_NAME" )   
 
For example to use Firebird generator defined in Step 1 use this lines:

    @SequenceGenerator( name = "ORDER_SEQUENCE", sequenceName = "GEN_ORDER", allocationSize = 1 ) 
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "ORDER_SEQUENCE" )     


Finally your java class looks like this:






I hope this can help you.

jueves, 26 de marzo de 2015

HTML Report from MySQLWorkbench 6.x Schema Model

This begun in 2010 when I started to create a Lua script to generate an HTML report from MySQLWorkbench 5.x (http://tmsanchezdev.blogspot.mx/2010/07/reporte-en-html-de-un-modelo-en.html).

Lua support has been removed from MySQLWorkbench and now we can use Python to generate plugins.

I updated the script to use phyton. Script is available here for download.
 
Update: I added both scripts in github, feel free to contribute https://github.com/tmsanchez/workbenchscripts
 
Update May 15th 221: for MySQLWorkbench 8.x check this http://tmsanchezdev.blogspot.com/2021/05/updated-plugings-for-mysqlworkbench-8x.html  
 
To Install the plugin go to Scripting / Install Plugin/Module then select HTMLShemaReport.py file and restart MySQL Workbench


Open your model and go to Tools / Catalog and select "Database schema in HTML format" and provide a file name in save dialog.



Once document has been generated you will see following message:

Then open your HTML document and see the report:

Finally I want to thank all readers for their contributions, specially to Rodrigo Schmidt who started script python.

viernes, 15 de noviembre de 2013

Reporte actualizado del modelo de la base de datos en MYSQL Workbench

Ha pasado algo de tiempo desde el último post.

Era el mes de Julio de 2010 cuando compartí con ustedes como generar un  Reporte en HTML de un modelo en MySQLWorkBench 5.2.25  utilizando un script LUA en MySQLWorkbench.

A partir de esa publicación, varias personas han contribuido forma valiosa para mejorar el script.

En esta ocasión agradezco a Paco Mora las mejoras que le ha hecho y pongo a la disposición de  ustedes el código que él me ha enviado.

De nueva cuenta reitero mi agradecimiento a todos los que han contribuido para mejorar éste script.

No se diga más, he aquí el código:


--[[Guardamos el esquema de la base de datos en la variable schema]] local schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/tables") local i--Varible para iterar el esquema. local j--Variable para iterar las tablas base de datos local k--Variable para iterar los campos de las tablas. print("<!DOCTYPE html>\n" ) print("<html>\n" ) print("<head>\n" ) print("<style>\n" ) print(" #customers\n" ) print(" {\n" ) print(" font-family:'Trebuchet MS', Arial, Helvetica, sans-serif;\n" ) print(" width:100%;\n" ) print(" border-collapse:collapse;\n" ) print(" }\n" ) print(" #customers td, #customers th \n" ) print(" {\n" ) print(" font-size:1em;\n" ) print(" border:1px solid #98bf21;\n" ) print(" padding:3px 7px 2px 7px;\n" ) print(" }\n" ) print(" #customers th \n" ) print(" {\n" ) print(" font-size:1.1em;\n" ) print(" text-align:left;\n" ) print(" padding-top:5px;\n" ) print(" padding-bottom:4px;\n" ) print(" background-color:#A7C942;\n" ) print(" color:#ffffff;\n" ) print(" }\n" ) print(" #customers tr.alt td \n" ) print(" {\n" ) print(" color:#000000;\n" ) print(" background-color:#EAF2D3;\n" ) print(" }\n" ) print(" </style>\n" ) print("\n" ) print("</head>" ) print("<body>" ) print("<table border='1' style='width:100%'> \n" ) for i=1, grtV.getn(schemata) do print("<tr id='customers'> \n" ) print("<td colspan='5'> NOMBRE DE LA BASE DE DATOS: " .. schemata[i].name .. "</td> \n") print("</tr> \n" ) print("<tr> \n" ) print("<td colspan='5'> </td> \n") print("</tr> \n" ) print("<tr> \n" ) print("<td colspan='5'>Tablas de la base de datos</td> \n") print("</tr> \n" ) for j=1, grtV.getn(schemata[i].tables) do print("<tr> \n" ) print("<td colspan='5'> <A href='#" .. schemata[i].tables[j].name .. "'>" .. schemata[i].tables[j].name .. "</A></td> \n") print("</tr> \n" ) end print("<tr> \n" ) print("<td colspan='5'>&nbsp;</td> \n") print("</tr> \n" ) print("<tr> \n" ) print("<td>COLUMN_NAME</td> \n") print("<td>TYPE</td> \n") print("<td>NULLABLE?</td> \n") print("<td>AUTO_INCREMENT?</td> \n") print("<td>COMMENTS</td> \n") print("</tr> \n" ) --Recorremos las tablas de la base de datos for j=1, grtV.getn(schemata[i].tables) do print("<tr> \n" ) print("<td colspan='5'>&nbsp;</td> \n") print("</tr> \n" ) print("<tr> \n" ) print ( " <td ><A name='" .. schemata[i].tables[j].name .. "'>" .. schemata[i].tables[j].name .. "</A></td> \n" )--Obtenemos el nombre de la tabla. print ( " <td colspan='4'>" .. schemata[i].tables[j].comment .. "/td> \n" )--Obtenemos el nombre de la tabla. print("</tr> \n" ) for k=1, grtV.getn(schemata[i].tables[j].columns) do print("<tr> \n" ) print ( " <td>" .. schemata[i].tables[j].columns[k].name .. "</td> \n" ) print ( " <td>" .. schemata[i].tables[j].columns[k].formattedType .. "</td> \n" ) if (schemata[i].tables[j].columns[k].isNotNull == 1) then print (" <td>" .. "NOT NULL" .. "</td> \n" ) else print ( " <td>" .. "NULL" .. "</td> \n" ) end if (schemata[i].tables[j].columns[k].autoIncrement == 1) then print (" <td>" .. "AUTO_INCREMENT" .. "</td> \n" ) else print (" <td>" .. " - " .. "</td> \n" ) end print ( " <td>" .. schemata[i].tables[j].columns[k].comment .. "</td> \n" ) print("</tr> \n" ) end end end print("</table> " ) print(" </body>" ) print("</html>" ) print ( "\n" )

viernes, 10 de febrero de 2012

IceFaces copia código de PrimeFaces línea por línea

Hace tiempo cuanto tuve que desarrollar sistemas en Web con Java estuve buscando un framework que soportara Ajax de forma transparente y encontré el framework ICEFaces el cual desde mi punto de vista es bueno.

Tiempo después encontré el excelente framework PrimeFaces cuya característica principal es que soportaba JSF 2.0. Este framework tiene excelentes componentes que permiten generar aplicaciones Web que mejoran la experiencia del usuario, si no me creen, denle un vistazo a los demos: http://www.primefaces.org/showcase-labs/ui/home.jsf y estoy seguro de que les va a gustar.

Leyendo el blog de PrimeFaces me encuentro noticia de que "IceFaces Copies PrimeFaces LineByLine", ---aclaro que desde el punto de vista legal, no es delito ya que primeFaces es open source---, lo que destacan en blog de primefaces es que no son tan "claros" dando el crédito a quien en verdad lo merece.

We have looked in detail of all IceFaces Ace Components and more than 90% of IceFaces components are like Panel. They are copied line by line, only difference is the change of package names from prime to ice. This duplication applies to java renderers, components codes, javascripts and css files as well.

Ustedes que opinan?

martes, 23 de agosto de 2011

Criteria: Combinando AND y OR en Hibernate

Seguramente en tus sistemas te has encontrado que tienes que hacer consultas con Hibernate que impliquen tener fija una condición y agregar varios criterios OR.

Vamos a suponer que tenemos una tabla con los siguientes campos

Producto(idProducto, nombreProducto, idProveedor, precio, categoria)

Y necesitas obtener los productos del proveedor "PR001" Y que el nombreProducto contenga "Computadora" O que el precio sea mayor a 1000 O que la categoria sea "PC", para lograrlo puedes hacer lo siguiente:

// creamos el criterio
Criteria criteria = session.createCriteria(Producto.class);

// Primero creamos el criterio fijo
Criterion critIdProveeodr = Restrictions.eq("idProveedor", "PR001");

// luego preparamos los OR
Disjunction disjunctionOrs = Restrictions.disjunction();

// y agregamos cada uno
disjunctionOrs.add(Restrictions.like("nombreProducto","Computadora",MatchMode.ANYWARE));
disjunctionOrs.add(Restrictions.gt("precio",1000));
disjunctionOrs.add(Restrictions.eq("categoria","PC"));

// creamos la combinación AND y OR
criteria.add( Restrictions.and(cridIdProveedor,disjunctionOrs));

// y por último los listamos
criteria.list();


Espero les sea de utilidad



viernes, 15 de julio de 2011

Nueva versión para generar Reporte en HTML de un modelo en MySQLWorkBench


Hace tiempo publiqué la forma de generar la documentación en HTML de una base de datos con la herramienta MySQLWorkBench. La versión inicial solo obtenía la información de las tablas.

Gracias al trabajo de Abraham Marcelino RamírezVega, ahora es posible obtener la documentación de las vistas y de los procedimientos almacenados.

Aquí les dejo la versión modificada con los cambios de Abraham:


local schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/1/tables")
local i
local j

print("Tablas\n" )
for i=1, grtV.getn(schemata) do

print("<HR><table border='1' style='width:100%'> \n" )
print("<tr><td colspan='5'> Nombre de la tabla: " .. schemata[i].name .. "</td></tr> \n")
print("<tr><td colspan='5'> Descripcion: " .. schemata[i].comment .. "</td> </tr>\n")
print("<tr> \n" )
print("<td>NOMBRE DE COLUMNA</td> \n")
print("<td>TIPO</td> \n")
print("<td>NULO</td> \n")
print("<td>AUTO INCRMENTAL</td> \n")
print("<td>COMENTARIOS</td> \n")
print("</tr> \n" )

for j=1, grtV.getn(schemata[i].columns) do
print("<tr> \n" )
print ( " <td>" .. schemata[i].columns[j].name .. "</td> \n" )
print ( " <td>" .. schemata[i].columns[j].formattedType .. "</td> \n" )

if (schemata[i].columns[j].isNotNull == 1) then
print (" <td>" .. "NOT NULL" .. "</td> \n" )
else
print ( " <td>" .. "NULL" .. "</td> \n" )
end

if (schemata[i].columns[j].autoIncrement == 1) then
print (" <td>" .. "AUTO_INCREMENT" .. "</td> \n" )
else
print (" <td>" .. " - " .. "</td> \n" )
end

print ( " <td>" .. schemata[i].columns[j].comment .. "</td>\n</tr>\n" )
end
print("</table>\n" )
end


print("<HR><Vistas\n" )
schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/1/views")
for i=1, grtV.getn(schemata) do

print("<HR><table border='1' style='width:100%'> \n" )
print("<tr><td colspan='5'> Nombre de la vista: " .. schemata[i].name .. "</td></tr> \n")
print("<tr><td colspan='5'> Descripcion: " .. schemata[i].comment .. "</td> </tr>\n")
print("<tr><td colspan='5'> Definicion de la vista:</td></tr><tr><td>" .. schemata[i].sqlDefinition .. "</td> </tr>\n")
print("</table>\n" )

end

print("Procedimientos Almacenados\n" )
schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/1/routines")

for i=1, grtV.getn(schemata) do
print("<HR><table border='1' style='width:100%'> \n" )
print("<tr><td colspan='5'> Nombre del procedimiento almacenado: " .. schemata[i].name .. "</td></tr> \n")
print("<tr><td colspan='5'> Typo del procedimiento almacenado: " .. schemata[i].routineType .. "</td></tr> \n")
print("<tr><td colspan='5'> Descripcion: " .. schemata[i].comment .. "</td> </tr>\n")
print("<tr><td colspan='5'> Parametros: </td> </tr>\n")
print ( "<tr>\n<td>Nombre del parametro</td>\n" )
print ( "<td>Tipo de dato del parametro</td>\n</tr>" )

for j=1, grtV.getn(schemata[i].params) do
print ( "<tr><td>" .. schemata[i].params[j].name .. "</td>" )
print ( "<td>" .. schemata[i].params[j].datatype .. "</td></tr>\n" )
end

print("<tr><td colspan='5'> Definicion del procedimiento almacenado:</td></tr>\n")
print("<tr><td colspan='5'>" .. schemata[i].sqlDefinition .. "</td></tr>\n")
print("</table>\n" )
end

jueves, 28 de octubre de 2010

Generar clases java a partir de un XSL para el comprobante fiscal digital

Tuve que entrarle al tema de la factura electrónica y su implementación en java y me encontré con que tenía que generar las clases del famoso Comprobante Fiscal Digital y que éste a su vez compliera con lo establecido por el esquema definido por el SAT.

Para generar las clases de java a partir del XSD solo utiliza el comando XJC que viene con el JDK 1.6.

Ejecuta lo siguiente desde una línea de comandos:

1) Copia el archivo XSD cfdv2.xsd del SAT a una carpeta y dentro de ella crea un folder que se llame src

2) Ejecuta la siguiente instrucción desde una línea de comandos:

xjc cfdv2.xsd -p mx.gob.sat.cfds.beans -d src\

Y listo con eso habrás generado las clases necesarias en java que representan al comprobante fiscal digital.

Para generar el sello y la cadena original puedes leer éste artículo.


PD. en Windows el xjc.exe está en la carpeta BIN del JDK

Espero les sea de utilidad.