我已经创建了数据库和所有具有所有外键约束的表。但是当我运行spring boot应用程序时,hibernate会抛出错误
无法对JDBC目标执行模式管理[alter table tlp_client添加约束FKfd2km387c8s4oou769dmw5t94外键 (u_frn_address_id)引用tlp_address(a_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 ...
}
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)
);
AddressModel
的
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)
);
我的问题是,我已经创建了所有表格,仍然为什么hibernate试图创建表格?
application.properties
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
更新
我在spring.jpa.hibernate.ddl-auto=validate
中设置application.properties
来运行应用程序,现在它正在抛出错误
架构验证:列[a_id]中遇到错误的列类型 table [tlp_address];找到[int(Types#INTEGER)],但期待 [bigint(Types#BIGINT)]
答案 0 :(得分:2)
似乎原始问题因设置
而消失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,
并重新创建表
答案 1 :(得分:0)
" Hibernate正在尝试创建表",因为使用proeprty spring.jpa.hibernate.ddl-auto进行配置。让我们像这样改变它的价值
spring.jpa.hibernate.ddl-auto=update
答案 2 :(得分:0)
错误是由于我犯了一个简单的错误。在sql脚本中,我有字段c_frn_addres_id
,但在实体类中,我将其映射到u_frn_address_id
。因此,将u_frn_address_id
更改为c_frn_address_id
后,工作正常
答案 3 :(得分:0)
这可能有许多原因。
例如,在MYSQL数据库中,您可以使用以下链接:
enter link description here
数据库开发中可能出现的常见原因之一是代码和数据库中列的类型不同。
例如:
在您的实体中,“ id”字段可能会导致“ int(11)”,但当前数据库期望的是“ bigint(20)”。
此干扰将导致以下错误:
Hibernate unable to add foreign key constraint
最后一步一步检查您的主外键。
希望对您有帮助...