Mostrando entradas con la etiqueta hibernate. Mostrar todas las entradas
Mostrando entradas con la etiqueta hibernate. Mostrar todas las entradas

martes, 21 de diciembre de 2021

Base de datos resta un día

 

Estoy trabajando con Java 11 e hibernate 5.4.7.Final pero cuando recuperaba 

los datos de la base me restaba un día y no sabía que pasaba.

Investigue y el error era por la configuración del país, revise la configuración 

del gestor mariaDB pero estaba correcto y no funcionó, y a hibernate no se le 

pudo cambiar, así que tuve que abrir la base de datos sin hibernate 

poniéndole la zona horaria del país directamente y allí funcionó 

lo hice cómo está continuación:

 

public Connection conexionSinHibernate() {


final String url = "jdbc:mysql://localhost:3306/nombreDeLaBase"+
"?useUnicode=true&useJDBCCompliantTimezoneShift=true"+
"&useLegacyDatetimeCode=false&serverTimezone=America/Guatemala";


final String driver = "com.mysql.jdbc.Driver";


final String usuario = "usuarioDeBaseDeDatos";


final String clave = "miclave";


Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, usuario, clave);
System.out.println("Conexion Exitosa");
} catch (ClassNotFoundException ex) {
System.out.println("Error al abrir la conexion");
} catch (SQLException ex) {
System.out.println("Conexion fallida por SQL");
}
return conn;

viernes, 11 de diciembre de 2020

Hibernate error 1452

 Trabajando con Hibernate una tabla padre y una hija, en la tabla padre ingresaba correctamente pero el error surgió cuando quise ingresar en la tabla hija me dio el siguiente error:

Hibernate:
    insert
    into
        pedidos
        (fkclientescodcliente, fechaEntrega, fechaPedido, notas, valor)
    values
        (?, ?, ?, ?, ?)
dic 10, 2020 3:25:34 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1452, SQLState: 23000
dic 10, 2020 3:25:34 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Cannot add or update a child row: a foreign key constraint fails (`studio`.`pedidos`, CONSTRAINT `fk_clientecodcliente` FOREIGN KEY (`fkclientescodcliente`) REFERENCES `clientes` (`codcliente`) ON DELETE NO ACTION ON UPDATE CASCADE)
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement

pase mucho tiempo tratando de encontrar la causa del error, es causado porque la tabla padre y la tabla hija tienen motor (ENGINE) diferente.

si vemos el motor de la tabla padre que en este caso es clientes en la consola de mariadb o mysql podríamos el siguiente comando (comando en negrilla y por supuesto cargando la base de datos con use <tabla> antes):


MariaDB [studio]> show create table clientes;

 

Nos dará el siguiente resultado:

| clientes | CREATE TABLE `clientes` (
  `codcliente` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(20) DEFAULT NULL,
  `apellido` varchar(20) DEFAULT NULL,
  `telefono` varchar(15) DEFAULT NULL,
  `direccion` varchar(50) DEFAULT NULL,
  `nit` varchar(15) DEFAULT NULL,
  `cuenta` decimal(12,2) DEFAULT NULL,
  PRIMARY KEY (`codcliente`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |

si vemos la última linea ENGINE=MyISAM tiene el motor MyISAM, ahora hacemos lo mismo con la tabla hija comando en negrilla:

 

MariaDB [studio]> show create table pedidos;

 

| pedidos | CREATE TABLE `pedidos` (
  `codPedido` int(11) NOT NULL AUTO_INCREMENT,
  `fechaPedido` date DEFAULT NULL,
  `fechaEntrega` date DEFAULT NULL,
  `valor` decimal(12,2) DEFAULT NULL,
  `fkclientescodcliente` int(11) DEFAULT NULL,
  `notas` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`codPedido`),
  KEY `fk_clientecodcliente_idx` (`fkclientescodcliente`),
  CONSTRAINT `fk_clientecodcliente` FOREIGN KEY (`fkclientescodcliente`) REFERENCES `clientes` (`codcliente`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 |

vemos nuevamente la última linea ENGINE=InnoDB tiene el motor InnoDB son diferentes así que deben ser iguales como InnoDB es mas moderno lo cambie en la tabla padre de la siguiente forma:

 

MariaDB [studio]> alter table clientes engine= innoDB;

 

Ahora al darle que nos muestre la creación de la tabla para ver el motor de la tabla padre (clientes) vemos que se a cambiado:

| clientes | CREATE TABLE `clientes` (
  `codcliente` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(20) DEFAULT NULL,
  `apellido` varchar(20) DEFAULT NULL,
  `telefono` varchar(15) DEFAULT NULL,
  `direccion` varchar(50) DEFAULT NULL,
  `nit` varchar(15) DEFAULT NULL,
  `cuenta` decimal(12,2) DEFAULT NULL,
  PRIMARY KEY (`codcliente`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |

y ahora se habra arreglado el error 1452, me costo mucho encontrar el error solo Gracias a Dios que lo pude arreglar asi que si a alguien le ayuda esto enhorabuena.
 

miércoles, 15 de abril de 2020

Error de boolean con hibernate y java

Estaba trabajando en un programa con java OpenJDK 8 e hibernate 5.4.7 y linux, el programa me funcionaba bien pero le agregué otra clase con un campo boolean y cuando corrí el programa resulta que ya no listaba, al ver los errores me salía los siguientes errores.

Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: [PersistenceUnit: prueba] Unable to build Hibernate SessionFactory

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [contactado] in table [prospectos]; found [tinyint (Types#TINYINT)], but expecting [bit (Types#BOOLEAN)]

En la base de datos el campo boolean lo había definido con un TINYINT y el atributo de la clase en java un boolean y eso creó el conflicto

Así que lo hay que hacer es agregar una definición de la comuna poniéndolo al atributo boolean de la clase en java como sigue:

@Column(name="contactado", columnDefinition = "TINYINT(1)")
    private boolean contactado;

jueves, 27 de febrero de 2020

Contar registros de una tabla con hibernate

Me llevó tiempo saber como se podía contar los registros de una tabla usando Hibernate 5.4.7.Final estoy usando java openJDK 8 pero la parte difícil era que yo quería usar la instrucción count() de MariaDB pero como las consultas de hibernate regresan un objeto como podía hacer para que regresara un solo valor, un número.
Después de buscar y probar mucho en internet encontré la forma y hago también la salvedad que probé con un integer pero no funciona, con int y con Integer.
Así quedo el método que regresa el número de filas de la tabla de datos.

public long totalDeRegistros(){
        long numTotalDeObjetos;
        TypedQuery<Long> consulta;
        EntityManager em = getEntityManager();
        consulta = em.createQuery("SELECT count(a) FROM Alumno as a",Long.class);
        numTotalDeObjetos =  consulta.getSingleResult();
        return numTotalDeObjetos;
    }

el método getSingleResult() es para resultados únicos como en este caso que regresa un número de registros para usarlo en listados de objetos si el resultado no existe o el número de los registros a regresar es más de uno dará una excepción por eso lo más recomendable es usarlo solo en respuestas únicas como count.