【发布时间】: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