programing

최대 절전 모드 4 업그레이드 후 "찾았습니다: 비트, 예상: 부울"

newsource 2023. 10. 7. 11:01

최대 절전 모드 4 업그레이드 후 "찾았습니다: 비트, 예상: 부울"

Hibernate 3.6.5에서 4.0으로 업그레이드하려고 합니다(그리고 Hibernate 4 지원에 필요한 Spring 3.0.5에서 3.1로 업그레이드하려고 합니다.

MySQL과 HSQL 모두에서 지속적인 부울 필드와 관련된 문제가 발생했습니다.

Caused by: org.hibernate.HibernateException: 
Wrong column type in PUBLIC.PUBLIC.EVENT for column Checked. Found: bit, expected: boolean
    at org.hibernate.mapping.Table.validateColumns(Table.java:282)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1268)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)

JPA 및 주석은 도메인 개체에 사용되며 문제가 있는 필드는 다음과 같습니다.

@Column(name = "Checked")
private boolean checked;

HSQL 스키마:

Checked bit default 0 not null,

MySQL 스키마:

`Checked` tinyint(1) NOT NULL default '0',

Hibernate 4를 고수하면서 이를 해결하는 가장 간단한 방법은?데이터베이스 스키마, 최대 절전 모드 구성 또는 도메인 클래스 주석을 변경해야 합니까?

코드와 구성이 이전에 완전히 "정확했는지"는 모르겠지만, 적어도 하이버네이트 3에서는 잘 작동했습니다.

제가 여기에 추가해서 해결한 겁니다.columnDefinition = "BIT"@Column 행으로 이동합니다.

@Basic
@Column(name = "B", columnDefinition = "BIT", length = 1)
public boolean isB() {
    return b;
}

DB에서도 'BIT(1)'로 정의되어 있습니다.TINYINT와 함께 작업했습니다.변경 사항이 매우 경미하고 DB를 터치할 필요가 없기 때문에 제가 찾은 가장 쉬운 해결책입니다.

사용 방법: MySQL Server 5.5.13, 최대 절전 모드 4.1.1, JDK 1.6

저도 같은 문제가 있었고, mysql이 boolean을 bit의 별칭으로 취급하는 것을 고려하여 방언을 확장했습니다.

public class Mysql5BitBooleanDialect extends MySQL5Dialect{     
    public Mysql5BitBooleanDialect() {
        super();
        registerColumnType( java.sql.Types.BOOLEAN, "bit" );        
    }       
}

더 긴 비트() 필드(예: 바이트[])를 사용하지 않기 때문에 이 필드가 끊어질 수 있습니다.

저는 이 문제를 다음과 같이 추가하여 해결할 수 있었습니다.transformedBitIsBoolean=trueMySQL 연결 문자열로 이동합니다.여기 참조: https://hibernate.atlassian.net/browse/HHH-6935

이에 대한 답변은 다음과 같습니다.

비트 또는 char 대신 Boolean용 JPA, MySQL 및 TinyInt(1) 최대 절전 모드

HSQL DB를 동시에 사용하기 때문에 문제가 조금 더 복잡해질 수 있지만, 어쨌든 보고 시도해 볼 수 있습니다!

내가 오르간.하이버네이트도 받은 문제를 발견했습니다.동면예외:잘못된 열 유형...발견: 비트, 예상: 부울

동면 4의 BooleanType에서 Ctor를 다음으로 변경했습니다.

public BooleanType() {
    this( org.hibernate.type.descriptor.sql.BooleanTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}

구본이 아닌

public BooleanType() {
    this( BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}

언급URL : https://stackoverflow.com/questions/8667965/found-bit-expected-boolean-after-hibernate-4-upgrade