Quiero mantener algunos datos en la base de datos H2 creando un repositorio CRUD, usando Hibernate.
No puedo hacer que la base de datos almacene mis entradas en absoluto. Actualmente, estoy tratando de lograr eso durante la actualización de la base de datos haciendo una entrada de muestra. La entrada se ve bien en los registros, pero la tabla no se crea/actualiza/genera.
¿Por qué Hibernate no puede crear una tabla en este caso? (si el problema radica en la estructura de mis datos)
Aquí está mi Entidad, clase Game.java (lo he intentado sin anotaciones de @Column, no hay diferencia. La identificación no se genera automáticamente, necesito poder ingresar mi propia identificación cada vez):
@Entity
@Table(name = "GAME")
public class Game {
@Id
@Column (name = "ID")
private long id;
@Column (name = "NAME")
private String name;
@Column(name = "STORYLINE", length = 4000)
private String storyline;
@Column(name = "AGGREGATED_RATING")
@JsonProperty("aggregated_rating")
private double aggregatedRating;
@Column(name = "FIRST_RELEASE_DATE")
@JsonProperty("first_release_date")
private long firstReleaseDate;
@Embedded
private Cover cover;
public Game(){
}
public Game(long id, String name, String storyline, double aggregatedRating, long firstReleaseDate, Cover cover) {
this.id = id;
this.name = name;
this.storyline = storyline;
this.aggregatedRating = aggregatedRating;
this.firstReleaseDate = firstReleaseDate;
this.cover = cover;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getStoryline() {
return storyline;
}
public double getAggregatedRating() {
return aggregatedRating;
}
public long getFirstReleaseDate() {
return firstReleaseDate;
}
public Cover getCover() {
return cover;
}
}
Y aquí está la clase Cover.java:
@Embeddable
public class Cover {
@Column (name = "URL")
private String url;
@JsonProperty("cloudinary_id")
@Column (name = "CLOUDINARY_ID")
private String cloudinaryId;
@Column (name = "WIDTH")
private Integer width;
@Column (name = "HEIGHT")
private Integer height;
public Cover(){
}
public Cover(String url, String cloudinaryId, Integer width, Integer height) {
this.url = url;
this.cloudinaryId = cloudinaryId;
this.width = width;
this.height = height;
}
public String getUrl() {
return url;
}
public String getCloudinaryId() {
return cloudinaryId;
}
public Integer getWidth() {
return width;
}
public Integer getHeight() {
return height;
}
}
Configuré la base de datos H2 aquí, en el archivo application.properties:
spring.h2.console.enabled=true
spring.h2.console.path=/h2_console
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
El repositorio está configurado así:
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface GameRepository extends CrudRepository<Game, Long> {
List<Game> findAllByName(String name);
}
Pruebo mi repositorio en localhost:8080/test, donde se debe insertar una entrada de muestra en la tabla:
@RequestMapping("/test")
public String saveSth(){
gameRepository.save(new Game(127, "Assassin's Creed II", "The lineage continues as this new chapter introduces Ezio, inheritor of the talents and creed of the Assassins. His family murdered by rival families, Ezio resolves to learn the ancient art of the Assassin in order to seek revenge. He will not do so alone though, allying with historical figures such as philosopher and writer Niccolò Machiavelli. You will also be able to master the art of the assassin with all new weapons and instruments created by the renowned inventor and genius of the Renaissance, Leonardo Da Vinci himself.", 90.25, 1258416000000L, new Cover("//images.igdb.com/igdb/image/upload/t_thumb/doczeiofd1ckpapdhqs7.jpg", "doczeiofd1ckpapdhqs7", 1000, 1426)));
return "success";
}
Obtengo el siguiente registro:
2017-07-25 13:09:58.873 DEBUG 9442 --- [nio-8080-exec-1] org.hibernate.SQL : select game0_.id as id1_0_0_, game0_.aggregated_rating as aggregat2_0_0_, game0_.cloudinary_id as cloudina3_0_0_, game0_.height as height4_0_0_, game0_.url as url5_0_0_, game0_.width as width6_0_0_, game0_.first_release_date as first_re7_0_0_, game0_.name as name8_0_0_, game0_.storyline as storylin9_0_0_ from game game0_ where game0_.id=?
Hibernate: select game0_.id as id1_0_0_, game0_.aggregated_rating as aggregat2_0_0_, game0_.cloudinary_id as cloudina3_0_0_, game0_.height as height4_0_0_, game0_.url as url5_0_0_, game0_.width as width6_0_0_, game0_.first_release_date as first_re7_0_0_, game0_.name as name8_0_0_, game0_.storyline as storylin9_0_0_ from game game0_ where game0_.id=?
2017-07-25 13:09:58.875 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [1] as [BIGINT] - [127]
2017-07-25 13:09:58.894 DEBUG 9442 --- [nio-8080-exec-1] org.hibernate.SQL : insert into game (aggregated_rating, cloudinary_id, height, url, width, first_release_date, name, storyline, id) values (?,?,?,?,?,?,?,?,?)
Hibernate: insert into game (aggregated_rating, cloudinary_id, height, url, width, first_release_date, name, storyline, id) values (?,?,?,?,?,?,?,?,?)
2017-07-25 13:09:58.895 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [1] as [DOUBLE] - [90.25]
2017-07-25 13:09:58.896 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [2] as [VARCHAR] - [doczeiofd1ckpapdhqs7]
2017-07-25 13:09:58.896 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [3] as [INTEGER] - [1426]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [4] as [VARCHAR] - [//images.igdb.com/igdb/image/upload/t_thumb/doczeiofd1ckpapdhqs7.jpg]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [5] as [INTEGER] - [1000]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [6] as [BIGINT] - [1258416000000]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [7] as [VARCHAR] - [Assassin's Creed II]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [8] as [VARCHAR] - [The lineage continues as this new chapter introduces Ezio, inheritor of the talents and creed of the Assassins. His family murdered by rival families, Ezio resolves to learn the ancient art of the Assassin in order to seek revenge. He will not do so alone though, allying with historical figures such as philosopher and writer Niccolò Machiavelli. You will also be able to master the art of the assassin with all new weapons and instruments created by the renowned inventor and genius of the Renaissance, Leonardo Da Vinci himself.]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder: binding parameter [9] as [BIGINT] - [127]
Parece que los datos están vinculados a parámetros, pero en la consola H2 SELECT * FROM GAME me devuelve: SELECT * FROM GAME; Tabla "JUEGO" no encontrada; Sentencia SQL: SELECT * FROM GAME [42102-193] 42S02/42102 (Ayuda)
Probé otros modos H2 como create-drop o create, pero no tuve éxito. Lo que me preocupa es que ni siquiera puedo hacer que la base de datos cree una tabla vacía con las filas correctas, lista para las entradas.
Creo que algo anda mal con mi Entidad o falta en la configuración de mi GameRepository, pero no tengo más ideas para corregir este error.
Quiero lograr lo que está aquí:
http://javasampleapproach.com/spring-framework/spring-boot/integrate-h2-database-springboot-spring-jpa-embedded-mode
Y aquí:
http://www.simplecodestuffs.com /valor-objeto-entidad-objeto-en-hibernate-mapping/
Además, probé este conjunto de tutoriales para variar:
https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/
https://springframework. guru/spring-boot-web-application-part-3-spring-data-jpa/
Pero sin suerte hasta ahora.
Solución del problema
Poniendo esta línea: spring.jpa.hibernate.ddl-auto = updateen su archivo application.properties, inicie los datos de población en la base de datos en memoria y en la base de datos basada en archivos para la base de datos H2. Espero que esto ayude a cualquiera.
No hay comentarios:
Publicar un comentario