programing

Maria에서 Boolean을 사용하여 5.2 스키마 유효성 검사 오류 발생DB

itmemos 2023. 10. 4. 20:59
반응형

Maria에서 Boolean을 사용하여 5.2 스키마 유효성 검사 오류 발생DB

저는 Spring JPA, Hibernate 5.2를 사용하여 Spring Boot 1.5 프로젝트를 만듭니다.스키마 설정을 만들었습니다.

spring.jpa.hibernate.ddl-auto: create

그런 다음 애플리케이션을 중지하고 다음 값으로 앱을 다시 시작했습니다.

spring.jpa.hibernate.ddl-auto: validate

저는 이런 콩을 가지고 있습니다.

@Entity
@Table(uniqueConstraints = { @UniqueConstraint(name = "account_username", columnNames = { "username" }) })
public class Account extends AbstractEntity implements CustomUserDetail {

    @NotBlank
    @Username
    @Column(nullable = false/* , unique = true */)
    private String username;

    private String password;

    private Instant lastPasswordUpdate;

    @NotNull
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private AccountType type = AccountType.USER;


    @NotNull
    @Column(nullable = false, columnDefinition = "BOOLEAN default true")
    private boolean enabled = true;

    @Audited
    @Size(min = 1)
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private Roles[] roles = new Roles[] {};

생성된 테이블은 다음과 같습니다.

CREATE TABLE `account` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `createdBy` varchar(255) DEFAULT NULL,
  `createdDate` datetime DEFAULT NULL,
  `lastModifiedBy` varchar(255) DEFAULT NULL,
  `lastModifiedDate` datetime DEFAULT NULL,
  `sid` varchar(36) NOT NULL,
  `version` bigint(20) NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  `lastPasswordUpdate` datetime DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `roles` json DEFAULT NULL,
  `type` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `account_username` (`username`),
  UNIQUE KEY `UK_5fs2lcge9gnvs1seea2fwnwv5` (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

애플리케이션을 시작할 때valitate옵션에 다음 오류가 표시됩니다.

 Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [enabled] in table [`Account`]; found [bit (Types#BIT)], but expecting [boolean default true (Types#BOOLEAN)]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateColumnType(AbstractSchemaValidator.java:159) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:143) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:313) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:452) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:889) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]

원래 스키마가 같은 정확한 구성으로 만들어졌으니 상당히 이상합니다.

다음 연결 속성을 사용했으며 Windows에서 MariaDB 10.2.13을 사용하고 있습니다.

spring.datasource.url=jdbc:mysql://localhost:3310/rebus?useLegacyDatetimeCode=false&serverTimezone=UTC&tinyInt1isBit=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect (with MariaDB53Dialect it's the same)
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

(옵션으로) 동일한 구성을 시도했습니다.transformedBitIsBoolean) 및 Mysql 5.7의 드라이버와 방언은 문제가 없습니다.

내가 뭘 잘못하고 있나요?어떻게 하면 맞춤형으로 모델을 더럽히고 지금처럼 깨끗하게 유지하지 않고 문제를 해결할 수 있을까요?

======= 업데이트 ============

하이버네이트에 대한 조사 및 디버깅AbstractSchemaValidator, 이것이 문제를 일으키고 있는 줄입니다.

boolean typesMatch = column.getSqlTypeCode( metadata ) == columnInformation.getTypeCode()
                || column.getSqlType( dialect, metadata ).toLowerCase(Locale.ROOT).startsWith( columnInformation.getTypeName().toLowerCase(Locale.ROOT) );

다음에서 탐지된 유형column.getSqlTypeCode( metadata )16이고, 대신에 타자를 쳐라.columnInformation.getTypeCode()-7. Mysql을 사용할 때 타입은 양쪽 모두 16입니다.

언급URL : https://stackoverflow.com/questions/49325483/hibernate-5-2-schema-validation-error-with-boolean-in-mariadb

반응형