programing

Oracle 10g을 사용할 때 Hibernate의 부동 소수점 열 스키마 유효성 검사와 관련하여 알려진 문제에 대한 가장 좋은 해결 방법은 무엇입니까?

newstyles 2023. 7. 23. 14:07

Oracle 10g을 사용할 때 Hibernate의 부동 소수점 열 스키마 유효성 검사와 관련하여 알려진 문제에 대한 가장 좋은 해결 방법은 무엇입니까?

최대 절전 모드를 통해 유지하는 이중 필드가 있는 여러 Java 클래스가 있습니다.예를 들어, 나는.

@Entity
public class Node ...

  private double value;

최대 절전 모드일 때org.hibernate.dialect.Oracle10gDialect노드 테이블에 대한 DDL을 생성하고 값 필드를 "두 배 정밀도" 유형으로 매핑합니다.

create table MDB.Node (... value double precision not null, ...

Oracle에서 "double precision"은 "float"의 별칭으로 나타납니다.따라서 데이터베이스 스키마를 확인하려고 할 때org.hibernate.cfg.AnnotationConfiguration.validateSchema()방법에 따라 Oracle은 값 열을 "부동"으로 설명하는 것으로 보입니다.이로 인해 최대 절전 모드에서 다음 예외가 발생합니다.

org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision

Hibernate의 JIRA 데이터베이스에도 HHH-1961이라는 매우 유사한 문제가 나와 있습니다.MySql, Postgres 및 Sql Server 지원을 중단하는 작업은 피하고 싶습니다. 이를 통해 다음과 같은 기능을 확장할 수 있습니다.Oracle10gDialectHHH-1961에서 언급된 해결책 중 가장 유망한 것으로 보입니다.하지만 방언을 확장하는 것은 제가 한 번도 해본 적이 없는 일이고, 저는 몇몇 끔찍한 잡동사니들이 있을지도 모른다고 생각합니다.MySql, Postgres 및 Sql Server와의 호환성을 유지하는 가장 좋은 해결 방법은 무엇입니까?

이것은 스키마 검증기의 알려진 제한 사항입니다. HHH-2315를 확인하십시오.여기에는 세 가지 옵션이 있습니다(실제로 네 가지 옵션이 있지만 검증을 비활성화하는 것은 원하지 않습니다).다음 중 하나:

  • 사용float대신에doubleJava 수준에서 - 그러나 이것은 옵션이 아닐 수 있습니다.

  • 패치org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo)이 특정한 경우에 대한 특별한 조건을 추가하는 것 - 이것은 정말 쉬운 선택이 아닙니다.

  • 확장합니다.org.hibernate.dialect.Oracle10gDialect그것을 이용하기 위하여floatSQL 유형의 경우DOUBLE

    public class MyOracle10gDialect extends Oracle10gDialect {
        public MyOracle10gDialect() {
            super();
        }
        protected void registerNumericTypeMappings() {
            super.registerNumericTypeMappings();
            registerColumnType( Types.DOUBLE, "float" );
        }
    }
    

후자의 옵션은 안전한 것처럼 보이지만 회귀 분석을 도입하지 않는지 확인하기 위해 몇 가지 테스트가 필요합니다.오라클의 JDBC 드라이버 코드를 보지 않았기 때문에 어떻게 하는지 말할 수 없습니다.float그리고.double precision드라이버 레벨에 따라 다릅니다.

(열 정의 = "NUMBER(9,2))를 추가하면 됩니다!

@Column(name = "CREDIT_AMOUNT", columnDefinition = "NUMBER(9,2)")
@Basic
private double creditAmount;

부울 필드의 HSQL 매핑과 관련하여 HHH-1598과 유사한 문제가 있었고, 여기에서 에 대한 논의가 있었습니다.

제가 사용하기로 선택한 솔루션은 HSQL Dialect의 확장으로 위에서 언급한 토론에 있었습니다.

저는 HSQL을 테스트에만 사용하지만, 이것에 문제가 없다고 생각합니다.

이것은 확실히 다른 DB를 방해하지 않습니다.

회원님의 'scale' 속성을 사용하세요.

언급URL : https://stackoverflow.com/questions/2625600/what-are-the-best-workarounds-for-known-problems-with-hibernates-schema-validat