Hibernate无法添加外键约束

Hibernate无法添加外键约束,hibernate,jpa,spring-boot,Hibernate,Jpa,Spring Boot,我已经创建了具有所有外键约束的数据库和所有表。但是当我运行spring启动应用程序时,hibernate抛出了错误 无法对JDBC目标[alter table]执行架构管理 tlp_客户端添加约束FKfd2km387c8s4oou769dmw5t94外键 (地址id)参考tlp地址(地址id)] 实体 @Entity @Table(name = "tlp_client") public class ClientModel { @Id @GeneratedValue(strategy

我已经创建了具有所有外键约束的数据库和所有表。但是当我运行spring启动应用程序时,hibernate抛出了错误

无法对JDBC目标[alter table]执行架构管理 tlp_客户端添加约束FKfd2km387c8s4oou769dmw5t94外键 (地址id)参考tlp地址(地址id)]

实体

@Entity
@Table(name = "tlp_client")
public class ClientModel {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "c_id")
   private Long id;

   @Column(name = "c_name")
   private String name;

   @Column(name = "c_description")
   private String description;

   @Column(name = "c_web_url")
   private String webUrl;

   @Column(name = "c_created_at")
   private Calendar createdAt;

   @Column(name = "c_is_active")
   private Boolean isActive;

   @OneToOne
   @JoinColumn(name = "u_frn_created_by", referencedColumnName = "u_id")
   private UserModel createdBy;

   @OneToOne
   @JoinColumn(name = "u_frn_address_id", referencedColumnName = "a_id")
   private AddressModel address;

    }
   // getters and setters ...
}
SQL for
ClientModel

create table tlp_client (
   c_id INT(11) AUTO_INCREMENT,
   c_name varchar(255) NOT NULL,
   c_description varchar(255), 
   c_web_url varchar(255),
   c_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   c_is_active TINYINT(1) DEFAULT 1,

   c_frn_created_by INT(11),
   c_frn_address_id INT(11),

   PRIMARY KEY (c_id),
   FOREIGN KEY (c_frn_address_id) REFERENCES tlp_address (a_id),
   FOREIGN KEY (c_frn_created_by) REFERENCES tlp_user (u_id)
);
create table tlp_address (
   a_id INT(11) AUTO_INCREMENT,
   a_address varchar(255),
   a_city varchar(255),
   a_state varchar(255),
   a_country varchar(255),
   a_zip varchar(8),

   PRIMARY KEY (a_id)
);
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dbName?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.pool.size=20
server.port=8090
用于
地址模型的SQL

create table tlp_client (
   c_id INT(11) AUTO_INCREMENT,
   c_name varchar(255) NOT NULL,
   c_description varchar(255), 
   c_web_url varchar(255),
   c_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   c_is_active TINYINT(1) DEFAULT 1,

   c_frn_created_by INT(11),
   c_frn_address_id INT(11),

   PRIMARY KEY (c_id),
   FOREIGN KEY (c_frn_address_id) REFERENCES tlp_address (a_id),
   FOREIGN KEY (c_frn_created_by) REFERENCES tlp_user (u_id)
);
create table tlp_address (
   a_id INT(11) AUTO_INCREMENT,
   a_address varchar(255),
   a_city varchar(255),
   a_state varchar(255),
   a_country varchar(255),
   a_zip varchar(8),

   PRIMARY KEY (a_id)
);
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dbName?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.pool.size=20
server.port=8090
我的问题是,我已经创建了所有的表,为什么hibernate要创建表

应用程序.属性

create table tlp_client (
   c_id INT(11) AUTO_INCREMENT,
   c_name varchar(255) NOT NULL,
   c_description varchar(255), 
   c_web_url varchar(255),
   c_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   c_is_active TINYINT(1) DEFAULT 1,

   c_frn_created_by INT(11),
   c_frn_address_id INT(11),

   PRIMARY KEY (c_id),
   FOREIGN KEY (c_frn_address_id) REFERENCES tlp_address (a_id),
   FOREIGN KEY (c_frn_created_by) REFERENCES tlp_user (u_id)
);
create table tlp_address (
   a_id INT(11) AUTO_INCREMENT,
   a_address varchar(255),
   a_city varchar(255),
   a_state varchar(255),
   a_country varchar(255),
   a_zip varchar(8),

   PRIMARY KEY (a_id)
);
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dbName?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.pool.size=20
server.port=8090
更新 我通过在
application.properties
中设置
spring.jpa.hibernate.ddl auto=validate
来运行应用程序,现在它抛出了错误

架构验证:中的[a_id]列中遇到错误的列类型 表[tlp_地址];找到[int(类型#整数)],但应为 [bigint(类型#bigint)]


似乎最初的问题随着设置而消失了

spring.jpa.hibernate.ddl-auto=validate
新问题是因为
hibernate
无法更改列类型。如果不删除并重新创建列(或整个表),无论如何都是不可能的

您的
ClientModel中有

@Column(name = "c_id")
private Long id; // Long maps to bigint 8 bytes
但是,在创建脚本中

c_id INT(11) AUTO_INCREMENT, -- int is 4 bytes
要获得适合列的
Long
值,它应该是
bigint
,但您已将其创建为
int
。将其更改为
bigint

c_id BIGINT AUTO_INCREMENT,
并重新创建表

请参阅和以获取参考。

“Hibernate正在尝试创建表”,因为您需要使用proeprty spring.jpa.Hibernate.ddl-auto进行配置。让我们像这样改变它的值

spring.jpa.hibernate.ddl-auto=update

您还可以参考工作示例,该错误是由我犯的一个简单错误引起的。在sql脚本中,我有字段
c\u frn\u addres\u id
,但在实体类中,我将其映射到
u\u frn\u address\u id
。因此,在将
u\u frn\u address\u id
更改为
c\u frn\u address\u id
后,它工作正常

这可能有许多原因
例如,在MYSQL数据库中,您可以使用以下链接:

数据库开发中可能出现的一个常见原因是代码和数据库中列的类型不同。
例如:
在实体中,“id”字段可能会导致“int(11)”,但当前数据库预期为“bigint(20)”。

此干扰将导致以下错误:

Hibernate unable to add foreign key constraint
最后一步一步地检查主外键。

我希望这会对你有所帮助…

我也这么做了,但它仍然显示出同样的错误,这太奇怪了。实际上,您只有足够的java实体,然后Hibernate/JPA将创建/更新映射您的实体的表