문제

다음 JPA 열 정의는 모든 데이터베이스에서 기본적으로 "정수"데이터 유형을 생성합니다 (예 : H2, MySQL, Postgres)

@Column(name = "type", nullable = false)
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = {
        @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"),
        @Parameter(name = "identifierMethod", value = "toInt"),
        @Parameter(name = "valueOfMethod", value = "fromInt") })
@NotNull
private DegreeType type;

이 필드에 최소 저장소를 사용하고 싶습니다. 따라서 schema2ddl 생성에 columnDefinition 매개 변수를 사용하는 것이 좋습니다. 그러나 Tinyint는 Postgres에서 지원되지는 않지만 위에서 언급 한 다른 데이터베이스에서 지원됩니다.

데이터베이스 유형에 따라 다른 SQL 파일을 생성 할 수 있습니까? 1. 이것을 달성하기위한 최선의 접근법은 무엇입니까? 2.이 목적으로 사용할 수있는 최소한의 데이터 유형 (최소 스토리지)은 무엇입니까? 그게 작은 일이 될 것입니다

도움이 되었습니까?

해결책

사용자 정의 유형 (왜?)를 사용하기 때문에 유형의 결과에 따라 기본 열 정의가 생성됩니다. sqlTypes() 방법. 실제 SQL 열 유형은 적절한 곳에서 얻을 수 있습니다. Dialect.

따라서 if sqlTypes() 돌아와야했다 new int[] {Types.TINYINT}, postgresql 방언은 그것을 매핑합니다 int2 및 h2 / mysql to tinyint.

그 모든 말을 할 것입니다 일반적으로 추천 :

  1. 사용 내장 열거 지원 ~을 통해 @Enumerated 주석.
  2. 열거적인 가치를 저장하십시오 정수보다는. 후자를 사용하면 일부 공간이 보존되지만 큰 잠재적 문제가 발생합니다. 3 개월 (몇 년) 줄 아래로 유형의 중간에 다른 열 상수를 일정하게 삽입하여 갑자기 모든 데이터가 유효하지 않습니다. 디스크 공간은 저렴합니다. 그런 문제를 다루는 것은 아닙니다.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top