【问题标题】:Spring/Hibernate: Table is not created - "Error executing DDL ...."Spring/Hibernate:未创建表 - “执行 DDL 时出错 ....”
【发布时间】:2019-05-29 16:28:03
【问题描述】:

在我的结构中,每个“任务”都与一个“问题”有 OneToOne 关系,每个“问题”都与“解决方案”有 OneToOne 关系。 “解决方案”有一个“项目”列表。

我找不到让它工作的方法。当休眠开始时我有这个异常并且没有创建表“项目”。

org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 JDBC 语句执行 DDL“更改表项添加约束 FKmkmqr7wiqxa0t51p9k4c9kbkb 外键 (solution_id) 引用解决方案 (id)”时出错 在 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] 在 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]

代码如下(省略 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;

}

【问题讨论】:

  • 您没有提到外键名称。在Item@ManyToOne注解后添加@JoinColumn(name = "solution_id")注解。
  • 它不起作用。同样的错误。
  • 你的意思是 same error - item 表的错误仍然存​​在?
  • 错误是一样的。我刚刚想通了。这是变量“值”。它会在 mysql 中生成语法错误。
  • 如果您在生成 pojo 时遇到困难,您可以使用 hibernate 逆向工程,它会根据数据库模式自动生成 pojo。这样您就不必担心架构错误。

标签: java mysql hibernate spring-boot jpa


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2020-08-28
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多