java - Spring/Hibernate:未创建表 - “执行 DDL 时出错 ....”
问题描述
在我的结构中,每个“任务”都与一个“问题”有 OneToOne 关系,每个“问题”都有一个“解决方案”的 OneToOne。“解决方案”有一个“项目”列表。
我找不到让它工作的方法。当休眠开始时我有这个异常并且没有创建表“项目”。
org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase 的 JDBC 语句执行 DDL“更改表项添加约束 FKmkmqr7wiqxa0t51p9k4c9kbkb 外键(solution_id)引用解决方案(id)”时出错.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:559) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:504) [hibernate-core-5.3.7.Final .jar:5.3.7.Final] 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyForeignKeys(AbstractSchemaMigrator.java:433) [hibernate-core-5.3.7.Final.jar:5.3。7.Final] 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:249) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org.hibernate.tool .schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator .java:183) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) [hibernate-core- 5.3.7.Final.jar:5.3.7.Final] 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:310) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在org.hibernate.boot.internal。SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) [hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) [spring-orm-5.1.3.RELEASE .jar:5.1.3.RELEASE]createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) [spring-orm-5.1.3.RELEASE.jar:5.1.3.RELEASE]createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) [spring-orm-5.1.3.RELEASE.jar:5.1.3.RELEASE]
代码如下(省略 getter 和 setter)。
任务
@Entity
@JsonIgnoreProperties(ignoreUnknown = true,
value = {"id"})
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@JsonProperty("task")
private String taskName;
private String status;
private Timestamps timestamps;
@OneToMany(mappedBy = "task", cascade = {CascadeType.ALL})
private List<Problem> problem;
public Task(){
}
}
问题
@Entity
public class Problem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer capacity;
@ElementCollection
@CollectionTable(name="weights",
joinColumns=@JoinColumn(name="problem_id"))
@Column(name="weights")
private List<Integer> weights;
@ElementCollection
@CollectionTable(name="_values",
joinColumns=@JoinColumn(name="problem_id"))
@Column(name="_values")
private List<Integer> values;
@ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JsonIgnore
private Task task;
@OneToOne
private Solution solution;
}
解决方案:
@Entity
public class Solution {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne(fetch=FetchType.LAZY)
@JsonIgnore
private Task task;
@OneToOne(cascade = {CascadeType.ALL})
private Problem problem;
@OneToMany
private List<Item> items;
}
物品:
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer values;
private Integer weight;
@ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JsonIgnore
private Solution solution;
}
解决方案
问题在于有一个名为“值”的变量/字段。“values”是Mysql中的保留字,所以Spring JPA生成的查询是无效的。
一种解决方案是将变量“values”更改为“_values”,或者@Column(name = "_value")
如果您需要在代码中保持名称相同,则添加注释。
推荐阅读
- python - 循环直到按键被按下并重复
- python - 如何根据出现来排列 Dataframe 值
- c# - 以百分比/概率在 Unity 中生成随机游戏对象
- python - Selenium Python 生成的包含 cookiebanner.js 信息的块输出
- c# - Assets\BlinkScript.cs(9,12):错误 CS0246:找不到类型或命名空间名称“文本”
- database - 如何使用 Postgres 触发器对一张表中的两列进行双重写入?
- amazon-dynamodb - 如何在这个 dynamodb 表中搜索唯一用户?
- selenium - io.cucumber.junit.UndefinedStepException:步骤“用户在登录页面”未定义。您可以使用下面的代码片段来实现它:
- javascript - 对象为空时如何设置警报消息
- vue.js - 如何在组件内定义一个 Vue 转换生命周期钩子以结束路由器转换?