首页 > 解决方案 > 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;

}

标签: javamysqlhibernatespring-bootjpa

解决方案


问题在于有一个名为“值”的变量/字段。“values”是Mysql中的保留字,所以Spring JPA生成的查询是无效的。

一种解决方案是将变量“values”更改为“_values”,或者@Column(name = "_value")如果您需要在代码中保持名称相同,则添加注释。


推荐阅读