我在内存DB中使用h2,我有一个小的 Spring Boot 应用程序。当尝试运行测试时,我得到错误:
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: Migration V1.0.1__create_authorities_table.sql failed
-----------------------------------------------------
SQL State : 90057
Error Code : 90057
Message : Constraint "PRIMARY KEY | UNIQUE (USERNAME)" not found; SQL statement:
所以它说Flyway不能构建它。我只有两个sql文件:V1.0.1__create_authorities_table.sql
CREATE TABLE users
(
id IDENTITY PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(68) NOT NULL,
enabled BOOLEAN NOT NULL
);
以及V1.0.1__create_authorities_table.sql
:
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL,
FOREIGN KEY (username) REFERENCES users(username)
);
CREATE UNIQUE INDEX ix_auth_username on authorities (username,authority);
我发现Flyway不喜欢FOREIGN KEY (username) REFERENCES users(username)
,所以我也尝试了ALTER TABLE authorities ADD FOREIGN KEY (username) REFERENCES users(username)
,但仍然不起作用。我检查了一下,当我刚刚删除添加FOREIGN KEY
时,测试是绿色的-没有错误。
从这一点看似乎是两种方式:https://stackoverflow.com/a/41515905/4952262对我来说是失败的-我在这里做错了什么?
1条答案
按热度按时间dba5bblo1#
指涉条件约束只能指涉唯一的数据行集合,必须要有主索引键或唯一的条件约束,因此您必须在
users(username)
上建立唯一的条件约束,才能从指涉条件约束指涉此数据行。您只需将内联约束添加到此列的定义中:
最好从
authorities
表中删除username
列,并添加类似于user_id BIGINT REFERENCES users(id)
的列来代替它,但是,在表之间复制长值并不是一个好的做法。