我想通过使用Hibernate创建CRUD存储库,在H2数据库中保留一些数据。
在这种情况下,为什么Hibernate不能创建表?
(如果问题在于我的数据结构)
这是我的实体,
Game.java
类(我尝试过没有@Column注释,没有区别。Id不是自动生成的,我需要能够每次输入自己的Id):
@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;
}
}
这是
封面.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;
}
}
我在这里配置了H2数据库,在
文件:
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
存储库
配置如下:
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface GameRepository extends CrudRepository<Game, Long> {
List<Game> findAllByName(String name);
}
我通过在localhost:8080/test下测试我的存储库,其中一个示例条目应该插入到表中:
@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";
}
我得到以下日志:
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]
看起来数据绑定到参数,但在H2控制台中
返回我:
未找到表“GAME”;SQL语句:
从游戏[42102-193]42S02/42102中选择*(帮助)
我认为我的实体或GameRepository配置中缺少了一些错误,但我没有更多的想法来修复这个错误。
我想实现以下目标:
http://javasampleapproach.com/spring-framework/spring-boot/integrate-h2-database-springboot-spring-jpa-embedded-mode
http://www.simplecodestuffs.com/value-object-entity-object-in-hibernate-mapping/
此外,我还尝试了这套教程来进行更改:
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/
但到目前为止运气不好。