MiniApplet 2.1 @firma firma de facturas

Es super sencillo, sin configuraciones de policies ni nada de nada.

		function saveSignatureCallback(signatureB64) {
			/* signatureB64 la firma */
			alert(signatureB64);
			/* Para fichero s de mas de 6 MB estos metodos devuelven null
			alert(MiniApplet.getTextFromBase64(signatureB64));
			alert(MiniApplet.getBase64FromText(signatureB64));
			*/
			/* Para guardar a fichero
			MiniApplet.saveDataToFile(
					signatureB64,
					"Guardar firma electru00F3nica",
					null,
					null,
					null);
			*/
		}
		
		function showLogCallback(errorType, errorMessage) {
			alert("Type: " + errorType + "nMessage: " + errorMessage);
		}
	
		function doSign() {
			try {
				var data = document.getElementById("data").value;
				
				alert(MiniApplet.getTextFromBase64(data));
				
				MiniApplet.sign(
					(data != undefined && data != null && data != "") ? data : null,
					'SHA1withRSA',
					'FacturaE',
					null,
					saveSignatureCallback,
					showLogCallback);
			
			} catch(e) {
				try {
					alert("Type: " + MiniApplet.getErrorType() + "nMessage: " + MiniApplet.getErrorMessage());
				} catch(ex) {
					alert("Error: " + e);
				}
			}
		}
<html>
	<head>
                <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
	        <script type="text/javascript" src="miniapplet.js"></script>
	        <script type="text/javascript">
                        // codigo anterior
	        </script>
	</head>
	<body>
		<script type="text/javascript">
			MiniApplet.cargarMiniApplet('file:///C:/@firma/bin/MiniApplet_v1_2/MiniApplet_v1_2/');
			// MiniApplet.checkTime(MiniApplet.CHECKTIME_RECOMMENDED, 60.000);
			// MiniApplet.setLocale("gl_ES");
		</script>
	</body>

dentro de file:///C:/@firma/bin/MiniApplet_v1_2/MiniApplet_v1_2/ hay los siguientes ficheros:

  • miniapplet_facturae.html. El que estoy mostrando
  • Originales (venian en el zip):
    • miniapplet_full.html.
    • miniapplet-full_1_2.jar
    • miniapplet.js
MiniApplet 2.1 @firma firma de facturas

Tomcat subir formularios de mas de 2MB

Recientemente necesitaba enviar a través del formulario una factura firmada. Las facturas no suelen ocupar mas de 100KB, pero cuando agregas adjuntos a la factura, este tamaño se puede incrementar hasta el infinito.

Estamos en el caso de un formulario normal, no un multipart. Para los multipart no hace falta nada de esta configuración. Los formularios multipart, son formularios de subida de ficheros, donde dentro del formulario existe un input del tipo «file». Yo necesitaba hacerlo transparente al usuario, que firme a través de la web y el proceso de grabado se realice sin mas interacción que la contraseña de su certificado.

El problema lo he tenido en dos sitios:

  • en el Applet de @firma. No puede firmar ficheros de mas de 2MB.
  • en el Tomcat, era incapaz de subir a traves del formulario ficheros de mas de 2MB.

Para estos dos problemas finalmente después de muchas horas de trabajo, he encontrado dos soluciones:

  • sustituir el Applet por el MiniApplet de @firma. Esta es una version mas reciente, mas rápida y eficiente, del cual no se cual es el limite máximo de ficheros a firmar, pero es bastante mas elevado. Creo que leí que estaba entorno a los 64MB. Pero seguro que depende de la capacidad de memoria y de procesamiento del ordenador cliente. El cambio no es nada doloroso.
  • en Tomcat y en la mayoría de servidores existe un máximo tanto para el GET como para el POST. Si bien el estándar no pone limites. En los navegadores, excluyendo Internet Explorer, para el POST no han puesto limite, pero si para el GET. En ambos casos se pretender prevenir un ataque de denegación de servicio.

Limite para el POST: en tomcat por defecto es de 2 MB. Para incrementarlo o dejarlo indefinido se utiliza el parametro: maxPostSize. En el manual de Tomcat, aparece como configurar este parámetro, debe ser configurado en bytes. Dentro de los Connectors.

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol"
               connectionTimeout="20000"
               maxPostSize="2000000"
               redirectPort="8443" />

Opciones:

  • maxPostSize=»2000000″. 2MB por defecto, no hace falta indicarlo.
  • maxPostSize=»-1″. Ilimitado, también indican que se puede poner maxPostSize=»0″.
  • maxPostSize=»6000000″. 6MB aproximadamente.

¿En que conectores ponerlo?, en todos, en los HTTP y en los AJP que redirijen el trafico.

En el caso de que tengas un cluster de Tomcat’s con un Apache delante, quizás es necesario que indiques también esta capacidad al Apache, en el httpd.conf.

Tomcat subir formularios de mas de 2MB

Enviar PDF Base64 y recibirlo

No convertir a String en ningun momento.

package net.pp.jm.varios;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;

import es.depontevedra.portales.portlets.facturae.util.ConstFacturae;

public class VariousTest {

	public static void main(String[] args) throws Exception {
		FileInputStream fis = new FileInputStream("c:\p.pdf");
		byte[] bb = IOUtils.toByteArray(fis);
		IOUtils.closeQuietly(fis);
		
		// lo envia el WS - el cliente lo recibe
		String fileB64 = Base64.encodeBase64String(bb);

		byte[] bb2 = Base64.decodeBase64(fileB64);
		
		FileOutputStream fos = new FileOutputStream("c:\p2_byte.pdf");
		IOUtils.write(bb2, fos);
		IOUtils.closeQuietly(fos);
	
		System.out.println("DONE");
	}
}

En mi caso tenia el problema que estaba recibiendo el Base64 y este habia sido codificado. Probando codificaciones di con la buena.

		String fileB64 = Base64.encodeBase64String(bb);
		byte[] utf8 = Base64.decodeBase64(fileB64);	
		byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");

		FileOutputStream fos = new FileOutputStream("c:\p2_byte.pdf");
		IOUtils.write(bb2, fos);
		IOUtils.closeQuietly(fos);
		System.out.println("DONE");
Enviar PDF Base64 y recibirlo

Static IP on Ubuntu Server 12.04

jmprieto@dev-server:~$ sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.2.54
netmask 255.255.255.0
gateway 192.168.2.1
jmprieto@dev-server:~$ sudo /etc/init.d/networking restart
sudo vi /etc/resolv.conf 
nameserver 192.168.2.1
nameserver 8.8.8.8
namserver  8.8.4.4
Static IP on Ubuntu Server 12.04

Install Maven3 on Ubuntu 12.04

previously install Java.

jmprieto@dev-server:~$ cd
jmprieto@dev-server:~$ ll
total 28
drwxr-xr-x 3 jmprieto jmprieto 4096 may  3 19:33 ./
drwxr-xr-x 3 root     root     4096 may  3 19:25 ../
-rw------- 1 jmprieto jmprieto  286 may  3 19:46 .bash_history
-rw-r--r-- 1 jmprieto jmprieto  220 may  3 19:25 .bash_logout
-rw-r--r-- 1 jmprieto jmprieto 3486 may  3 19:25 .bashrc
drwx------ 2 jmprieto jmprieto 4096 may  3 19:26 .cache/
-rw-r--r-- 1 jmprieto jmprieto  675 may  3 19:25 .profile
jmprieto@dev-server:~$ pwd
/home/jmprieto
jmprieto@dev-server:~$ wget http://apache.rediris.es/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
--2014-05-03 20:05:38--  http://apache.rediris.es/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
Resolviendo apache.rediris.es (apache.rediris.es)... 130.206.1.5
Conectando con apache.rediris.es (apache.rediris.es)[130.206.1.5]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 6927918 (6,6M) [application/x-gzip]
Grabando a: “apache-maven-3.2.1-bin.tar.gz”

100%[======================================================================================================================================================================>] 6.927.918   1,74M/s   en 3,6s    

2014-05-03 20:05:42 (1,83 MB/s) - “apache-maven-3.2.1-bin.tar.gz” guardado [6927918/6927918]

jmprieto@dev-server:~$ tar -zxf apache-maven-3.2.1-bin.tar.gz 
jmprieto@dev-server:~$ ll
total 6800
drwxr-xr-x 4 jmprieto jmprieto    4096 may  3 20:06 ./
drwxr-xr-x 3 root     root        4096 may  3 19:25 ../
drwxrwxr-x 6 jmprieto jmprieto    4096 may  3 20:06 apache-maven-3.2.1/
-rw-rw-r-- 1 jmprieto jmprieto 6927918 feb 22 09:27 apache-maven-3.2.1-bin.tar.gz
-rw------- 1 jmprieto jmprieto     286 may  3 19:46 .bash_history
-rw-r--r-- 1 jmprieto jmprieto     220 may  3 19:25 .bash_logout
-rw-r--r-- 1 jmprieto jmprieto    3486 may  3 19:25 .bashrc
drwx------ 2 jmprieto jmprieto    4096 may  3 19:26 .cache/
-rw-r--r-- 1 jmprieto jmprieto     675 may  3 19:25 .profile
jmprieto@dev-server:~$ sudo cp -R apache-maven-3.2.1 /usr/local
jmprieto@dev-server:~$ ll /usr/local/apache-maven-3.2.1/
total 48
drwxr-xr-x  6 root root  4096 may  3 20:06 ./
drwxr-xr-x 11 root root  4096 may  3 20:06 ../
drwxr-xr-x  2 root root  4096 may  3 20:06 bin/
drwxr-xr-x  2 root root  4096 may  3 20:06 boot/
drwxr-xr-x  3 root root  4096 may  3 20:06 conf/
drwxr-xr-x  3 root root  4096 may  3 20:06 lib/
-rw-r--r--  1 root root 14865 may  3 20:06 LICENSE
-rw-r--r--  1 root root   182 may  3 20:06 NOTICE
-rw-r--r--  1 root root  2513 may  3 20:06 README.txt
jmprieto@dev-server:~$ vi ~/.profile
jmprieto@dev-server:~$ exit
export JAVA_HOME="/usr/lib/jvm/java-6-openjdk"
export M2_HOME="/usr/local/apache-maven-3.2.1"
export M2="$M2_HOME/bin"
export PATH="$M2:$PATH"
jmprieto@dev-server:~$ java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.4)
OpenJDK Server VM (build 20.0-b12, mixed mode)
jmprieto@dev-server:~$ mvn -v
Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T18:37:52+01:00)
Maven home: /usr/local/apache-maven-3.2.1
Java version: 1.6.0_27, vendor: Sun Microsystems Inc.
Java home: /usr/lib/jvm/java-6-openjdk-i386/jre
Default locale: es_ES, platform encoding: UTF-8
OS name: "linux", version: "3.11.0-15-generic", arch: "i386", family: "unix"
Install Maven3 on Ubuntu 12.04

Add license to Java source Maven project

from this project.

	<build>
		<plugins>
			<plugin>
				<groupId>com.mycila</groupId>
				<artifactId>license-maven-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<header>com/mycila/maven/plugin/license/templates/APACHE-2.txt</header>
					<properties>
						<owner>Jose Manuel Prieto Palacios</owner>
						<email>josemanuel@prietopalacios.net</email>
					</properties>
					<excludes>
						<exclude>**/README</exclude>
						<exclude>**/*.launch</exclude>
						<exclude>**/*.xml</exclude>
						<exclude>**/*.properties</exclude>
						<exclude>**/*.txt</exclude>
						<exclude>src/test/resources/**</exclude>
						<exclude>src/main/resources/**</exclude>
					</excludes>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

Licenses:

  • AGPL-3
  • APACHE-2
  • BSD-2
  • BSD-3
  • BSD-4
  • GPL-3
  • LGPL-3
  • MIT
  • MPL-2
  • WTFPL
Add license to Java source Maven project

Apache RAT

Apache RAT, pertenece al proyecto Apache Creadur. Por lo poco que he entendido, es para agregar licencias a todas tus clases, ficheros. Tal y como esta cualquier clase de Apache, donde aparece arriba del todo, despues de la palabra reservada package, la licencia.
Pero para salir de dudas, me he descargado la libreria y he realizado estas pruebas.

Dentro de la carpeta descomprimida, he creado la carpeta «test». En esta carpeta he metido una clase, que ha resultado ser una interfaz de un web service.
Ubicado en la carpeta descomprimida he ejecutado lo siguiente:

 
E01740@ES-D-04744LT /cygdrive/c/Software/apache-rat-0.10
$ java -jar apache-rat-0.10.jar --help
usage: java rat.report [options] [DIR|TARBALL]
Options
 -A,--addLicense                Add the default licence header to any file
                                with an unknown licence that is not in the
                                exclusion list. By default new files will
                                be created with the licence header, to
                                force the modification of existing files
                                use the --force option.
 -a,--addLicence                Add the default licence header to any file
                                with an unknown licence that is not in the
                                exclusion list. By default new files will
                                be created with the licence header, to
                                force the modification of existing files
                                use the --force option.
 -c,--copyright <arg>           The copyright message to use in the
                                licence headers, usually in the form of
                                "Copyright 2008 Foo"
 -d,--dir                       Used to indicate source when using
                                --exclude
 -E,--exclude-file <fileName>   Excludes files matching regular expression
                                in <file> Note that --dir is required when
                                using this parameter.
 -e,--exclude <expression>      Excludes files matching wildcard
                                <expression>. Note that --dir is required
                                when using this parameter. Allows multiple
                                arguments.
 -f,--force                     Forces any changes in files to be written
                                directly to the source files (i.e. new
                                files are not created)
 -h,--help                      Print help for the Rat command line
                                interface and exit
 -s,--stylesheet <arg>          XSLT stylesheet to use when creating the
                                report.  Not compatible with -x
 -x,--xml                       Output the report in raw XML format.  Not
                                compatible with -s

NOTE:
Rat is really little more than a grep ATM
Rat is also rather memory hungry ATM
Rat is very basic ATM
Rat highlights possible issues
Rat reports require intepretation
Rat often requires some tuning before it runs well against a project
Rat relies on heuristics: it may miss issues

Asi que si no lo he entendido mal. Si ejecuto esto:

 
$ java -jar apache-rat-0.10.jar -d test -a

*****************************************************
Summary
-------
Generated at: 2014-04-30T09:39:43+02:00
Notes: 0
Binaries: 0
Archives: 0
Standards: 1

Apache Licensed: 0
Generated Documents: 0

JavaDocs are generated and so license header is optional
Generated files do not required license headers

1 Unknown Licenses

*******************************

Unapproved licenses:

  test/Cargos.java

*******************************

Archives:

*****************************************************
  Files with Apache License headers will be marked AL
  Binary files (which do not require AL headers) will be marked B
  Compressed archives will be marked A
  Notices, licenses etc will be marked N
 !????? test/Cargos.java

*****************************************************
 Printing headers for files without AL header...


=======================================================================
==test/Cargos.java
=======================================================================
package es.depontevedra.soap.cargows.services;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;

@WebService
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public interface Cargos {

        @WebMethod(action="crearCargo")
        public String crearCargo(String xml);

        @WebMethod(action="modificarCargo")
        public String modificarCargo(String xml);

        @WebMethod(action="anularCargo")
        public String anularCargo(String xml);

        @WebMethod(action="consultarCargo")
        public String consultarCargo(String xml);

        @WebMethod(action="consultarConceptos")
        public String consultarConceptos(String xml);

        @WebMethod(action="consultarTributos")
        public String consultarTributos(String xml);

        @WebMethod(action="obtenerRecibo")
        public String obtenerRecibo(String xml);

}

Parece que ha tocado algo en mi clase. La reviso:

 
package es.depontevedra.soap.cargows.services;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;

@WebService
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public interface Cargos {

	@WebMethod(action="crearCargo")
	public String crearCargo(String xml);
	
	@WebMethod(action="modificarCargo")
	public String modificarCargo(String xml);
	
	@WebMethod(action="anularCargo")
	public String anularCargo(String xml);
	
	@WebMethod(action="consultarCargo")
	public String consultarCargo(String xml);
	
	@WebMethod(action="consultarConceptos")
	public String consultarConceptos(String xml);
	
	@WebMethod(action="consultarTributos")
	public String consultarTributos(String xml);
	
	@WebMethod(action="obtenerRecibo")
	public String obtenerRecibo(String xml);
	
}

Me ha gustado eso del copyright que aparece en la ayuda. Voy a probar:

 
$ java -jar apache-rat-0.10.jar -d test -a -c "Jose Manuel Prieto Palacios"

Mi clase se queda:

 
package es.depontevedra.soap.cargows.services;
/*
 *
 * Jose Manuel Prieto Palacios
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;

@WebService
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public interface Cargos {

	@WebMethod(action="crearCargo")
	public String crearCargo(String xml);
	
	@WebMethod(action="modificarCargo")
	public String modificarCargo(String xml);
	
	@WebMethod(action="anularCargo")
	public String anularCargo(String xml);
	
	@WebMethod(action="consultarCargo")
	public String consultarCargo(String xml);
	
	@WebMethod(action="consultarConceptos")
	public String consultarConceptos(String xml);
	
	@WebMethod(action="consultarTributos")
	public String consultarTributos(String xml);
	
	@WebMethod(action="obtenerRecibo")
	public String obtenerRecibo(String xml);
	
}

Configurarlo con maven

Uso basico
En la fase de verificacion
Añadiendo un informe cuando el proyecto se compila
Aplicar una licencia personalizada

En maven simplemente se comprueba que todos los ficheros tienen licencia. Usar solo como verificador.

Apache RAT

Java Proxy

Sacado de esta pagina.

Para salir a internet mediante un proxy con Java tienes las siguientes opciones:

HTTP

En la llamada a la JVM, al invocar la clase:

$ java -Dhttp.proxyHost=webcache.mydomain.com MiClaseConMetodoMain
$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 MiClaseConMetodoMain
$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080-Dhttp.noProxyHosts=”localhost|host.mydomain.com” MiClaseConMetodoMain

En el codigo de la clase:

System.setProperty("http.proxyHost", "webcache.mydomain.com");
System.setPropery("http.proxyPort", "8080");

// Next connection will be through proxy.
URL url = new URL("http://java.sun.com/");
InputStream in = url.openStream();

// Now, let's 'unset' the proxy.
System.setProperty("http.proxyHost", null); // From now on http connections will be done directly.

HTTPS

htttps.proxyHost
https.proxyPort
http.nonProxyHosts

FTP

ftp.proxHost
ftp.proxyPort
ftp.nonProxyHosts

Configurando mas de un proxy:

$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 -Dftp.proxyHost=webcache.mydomain.com -Dftp.proxyPort=8080 MiClaseConMetodoMain

SOCKS

socksProxyHost
socksProxyPort (default 1080)

Si defines un proxy HTTP y uno SOCKS,

  • tiene preferencia el HTTP.
  • El proxy SOCKS sera ignorado, para conexiones HTTP y SOCKS
  • Una conexion FTP, en esta configuracion, iria por SOCKS.

LA CLASE: java.net.Proxy

//creamos proxy HTTP
SocketAddress addr = new InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);

// lo invocamos
URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);

// no queremos invocarlo
URL url2 = new URL("http://infos.mydomain.com/");
URLConnection conn2 = url2.openConnection(Proxy.NO_PROXY);

//creamos proxy SOCK
SocketAddress addr = new InetSocketAddress("socks.mydomain.com", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);

// lo invocamos
URL url = new URL("ftp://ftp.gnu.org/README");
URLConnection conn = url.openConnection(proxy);


// Invocacion especifica de proxy para una conexion Socket
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("server.foo.com", 1234);
socket.connect(dest);

// no queremos invocarlo
Socket socket = new Socket(Proxy.NO_PROXY);
socket.connect(new InetAddress("localhost", 1234));

LA CLASE: java.net.ProxySelector

Determina para que conexiones usar un proxy u otro

public abstract class ProxySelector {
        public static ProxySelector getDefault();
        public static void setDefault(ProxySelector ps);
        public abstract List<Proxy> select(URI uri);
        public abstract void connectFailed(URI uri,
                SocketAddress sa, IOException ioe);
}
Java Proxy

Java Hibernate DDBB, Date

En java tenemos:

  1. el paquete java.util
    • Date: representa el tiempo con precision de milisegundos
    • Calendar: clase abstrapta que provee metodos para convertir instantes de tiempo en un conjunto de campos del calendario.
    • GregorianCalendar: es una clase concreta de Calendar.
  2. el paquete java.sql
    • Date: solo guarda la fecha
    • Time: solo guarda la hora
    • Timestamp: guarda la fecha y la hora

En las bases de datos Oracle tenemos:

  • Date: guarda fecha y hora pero solo con una precision de 1 segundo
  • Time: guarda la hora.
  • Timestamp: guarda fecha y hora.

Si tratas de convertir un tipo de dato SQL.DATE en java.util.Date: tienes que usar la anotacion de JPA: @Temporal que indica que se debe hacer una conversion temporal al tipo (indicado en la anotacion), para tranformarlo al tipo especificado en la clase.

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "FECHA_DATE", nullable = false)
	public java.util.Date getFechaDate() {
		return this.fechaDate;
	}

De esta manera conservamos la fecha y la hora.

Solucion a errores:
jpa-2-0-oracle-date-has-null-time

Java Hibernate DDBB, Date