添加 table 关系时未找到 Table
Table is not found when table relation is added
我想在 Spring 中使用 JPA。我试图实现这个:
主要table商家:
@Entity
@Table
public class Merchants {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "merchantId", updatable = false, nullable = false)
private int merchantId;
@Column
private String name;
@OneToMany(mappedBy="merchants")
private List<Terminals> terminals;
@Column
private String login;
}
第二个 table 持有商家 ID:
@Entity
@Table
public class Terminals {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private int id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="merchantId")
private Merchants merchants;
@Column
private String mode;
}
但是当我部署代码时出现异常:
Caused by: java.sql.SQLException: Table 'production.terminals' doesn't exist
Query is: alter table terminals drop foreign key FKbemlf2t70j5blgdda69vyl032
当我删除 table 关系代码时,table 的创建没有错误。
有什么解决办法吗?
编辑:
MariaDB [production]> show tables;
+------------------------------+
| Tables_in_production |
+------------------------------+
| hibernate_sequence |
| merchants |
| terminals |
+------------------------------+
3 rows in set (0.00 sec)
MariaDB [production]>
application.properties
spring.jmx.enabled=false
spring.datasource.jndi-name=java:/global/production
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
request.limit=300000
运行 在 sqlyog 或 mysql workbench 或任何编辑器中的此 "alter table terminals drop foreign key FKbemlf2t70j5blgdda69vyl032" 查询然后启动应用程序否则删除表并启动应用程序因为外键已经错误映射。所以我们必须手动输入那个错误的外键
您在此处看到的问题与您在 application.properties
文件中定义的 DDL 策略有关。
您似乎使用 create-drop
告诉 Hibernate 创建然后在会话结束后销毁数据库模式。 Hibernate 通常支持以下 DDL 指令:
- 更新(必要时更新模式)
- 创建(创建模式并销毁以前的数据)
- create-drop(创建然后在会话结束时销毁模式)
- none(禁用 ddl 处理)
- validate(验证架构,不对数据库进行任何更改)
无论如何,我已经看到这种情况发生,使用 create-drop
DDL 策略和 H2 数据库进行集成测试。我从来没有花时间对此进行更多研究,但这可能归因于您使用的方言,因为标准 MySQL 不会发生这种情况。
尽管如此,我倾向于避免使用 Hibernate 的 DDL 函数来创建或更改我的数据库模式——尤其是在我的生产部署中。虽然它对大多数人来说效果很好,但使用自动 DDL 功能会导致许多讨厌的副作用。
因此,我倾向于将 Hibernate 的 DDL 函数设置为 validate
并使用 Flyway https://flywaydb.org/.
处理所有需要的模式更改 - 从创建到数据更改
这样我就可以 运行 我自己的 sql 脚本来执行我需要的任何更改。我认为使用 flyway 是一种更好的选择,因为它允许执行以下操作:
验证架构更改。
处理任何数据库更改的更安全方法。
允许 VCS 控制架构更改(实际脚本)。
总的来说集成度很好,设置也很简单,建议大家看看
我想在 Spring 中使用 JPA。我试图实现这个:
主要table商家:
@Entity
@Table
public class Merchants {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "merchantId", updatable = false, nullable = false)
private int merchantId;
@Column
private String name;
@OneToMany(mappedBy="merchants")
private List<Terminals> terminals;
@Column
private String login;
}
第二个 table 持有商家 ID:
@Entity
@Table
public class Terminals {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private int id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="merchantId")
private Merchants merchants;
@Column
private String mode;
}
但是当我部署代码时出现异常:
Caused by: java.sql.SQLException: Table 'production.terminals' doesn't exist
Query is: alter table terminals drop foreign key FKbemlf2t70j5blgdda69vyl032
当我删除 table 关系代码时,table 的创建没有错误。 有什么解决办法吗?
编辑:
MariaDB [production]> show tables;
+------------------------------+
| Tables_in_production |
+------------------------------+
| hibernate_sequence |
| merchants |
| terminals |
+------------------------------+
3 rows in set (0.00 sec)
MariaDB [production]>
application.properties
spring.jmx.enabled=false
spring.datasource.jndi-name=java:/global/production
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
request.limit=300000
运行 在 sqlyog 或 mysql workbench 或任何编辑器中的此 "alter table terminals drop foreign key FKbemlf2t70j5blgdda69vyl032" 查询然后启动应用程序否则删除表并启动应用程序因为外键已经错误映射。所以我们必须手动输入那个错误的外键
您在此处看到的问题与您在 application.properties
文件中定义的 DDL 策略有关。
您似乎使用 create-drop
告诉 Hibernate 创建然后在会话结束后销毁数据库模式。 Hibernate 通常支持以下 DDL 指令:
- 更新(必要时更新模式)
- 创建(创建模式并销毁以前的数据)
- create-drop(创建然后在会话结束时销毁模式)
- none(禁用 ddl 处理)
- validate(验证架构,不对数据库进行任何更改)
无论如何,我已经看到这种情况发生,使用 create-drop
DDL 策略和 H2 数据库进行集成测试。我从来没有花时间对此进行更多研究,但这可能归因于您使用的方言,因为标准 MySQL 不会发生这种情况。
尽管如此,我倾向于避免使用 Hibernate 的 DDL 函数来创建或更改我的数据库模式——尤其是在我的生产部署中。虽然它对大多数人来说效果很好,但使用自动 DDL 功能会导致许多讨厌的副作用。
因此,我倾向于将 Hibernate 的 DDL 函数设置为 validate
并使用 Flyway https://flywaydb.org/.
这样我就可以 运行 我自己的 sql 脚本来执行我需要的任何更改。我认为使用 flyway 是一种更好的选择,因为它允许执行以下操作:
验证架构更改。
处理任何数据库更改的更安全方法。
允许 VCS 控制架构更改(实际脚本)。
总的来说集成度很好,设置也很简单,建议大家看看