source

최대 절전 모드에서 열거형, 열거형으로 지속

lovecheck 2023. 7. 31. 21:29
반응형

최대 절전 모드에서 열거형, 열거형으로 지속

MySQL 데이터베이스에는 "gender enum('남성', '여성')" 열이 있습니다.

내 열거형 "com.mydomain.myapp.enums"를 만들었습니다.성별", 그리고 내 안에서.Person실체 I는 "젠더 젠더"로 정의됩니다.

이제 MySQL 데이터베이스에 열거형을 유지하고 싶지만 응용 프로그램을 실행하면 다음과 같은 메시지가 나타납니다.

MyApp의 열 유형이 잘못되었습니다.성별 열에 대한 사용자입니다.발견됨: 열거형, 예상됨: 정수

왜 이러한가?이것은 마치 제가 "@Enumerated(EnumType)"로 "성별 성별"에 주석을 달았을 때와 같습니다.ORDERAL)", 저는 가지고 있지 않습니다.EnumType은 ORDINAL 또는 STRING만 될 수 있는 것 같은데, 필드를 int가 아닌 enum으로 처리하도록 지정하려면 어떻게 해야 합니까?(차이가 많이 있다는 것은 아니지만, 그것에 대해 화를 낼 만큼 충분합니다.)

최대 절전 모드에 열 정의를 지정하면 다음 중 하나를 추측하려고 하지 않습니다.

@Column(columnDefinition = "enum('MALE','FEMALE')")
@Enumerated(EnumType.STRING)
private Gender gender;

어떤 이유로든 스키마를 생성하기 위해 최대 절전 모드를 사용하지 않는 경우에는 Definition(정의) 열에 실제 값을 제공할 필요가 없습니다.이렇게 하면 값을 동기화해야 하는 인스턴스를 제거할 수 있습니다.Java 열거형과 Liquibase 또는 SQL 스크립트를 동기화하기만 하면 됩니다.

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;

MySQL enum 유형은 매우 독점적이며 Hibernate에서 잘 지원되지 않는 것으로 알고 있습니다. Gavin King의 이 의견을 참조하십시오(이 관련 문제는 약간 다르지만 중요한 부분은 아닙니다).

그래서, 제 생각에 당신은 당신의 것을 사용해야 할 것 같습니다.UsereType그리고 Java 5 EnumUserType의 Flexible 솔루션 작동 버전을 사용하는 것이 좋습니다(예를 들어 Appfuse의 Java 5 Enums Persistence with Hibernate 참조).

개인적으로, 저는 MySQL 열거형을 사용하는 것에 대한 생각을 잊고 싶습니다. "혜택"이 가치가 있는지 확신할 수 없습니다(자세한 내용은 이 답변 참조).

@Enumerated(EnumType)를 사용해 보십시오.STRING) 및 다음과 같이 열거형을 정의합니다.

enum Gender {
  male,
  female
}

소문자 값을 기록합니다.

적어도 VARCHAR 열에서는 작동합니다.열거형을 '남성' 또는 '여성' 문자열로 저장합니다.

최대 절전 모드 설명서에 없는 이유는 확실하지 않지만 이렇게 할 수 있습니다.

<property name="type" column="type" not-null="true">
    <type name="org.hibernate.type.EnumType">
        <param name="enumClass">com.a.b.MyEnum</param>
        <param name="type">12</param>
        <!-- 12 is java.sql.Types.VARCHAR -->
    </type> 
</property>

이 경우는 아니지만 XML 매핑을 사용하는 경우:

<property name="state" column="state" not-null="true">
  <type name="org.hibernate.type.EnumType">
    <param name="enumClass">com.myorg.persistence.data.State</param>
  </type>
</property>

순서 값을 읽을 수 있도록 하려면 데이터베이스 열 유형이 숫자여야 합니다(예: mysql의 tinyint).

언급URL : https://stackoverflow.com/questions/2160700/enum-in-hibernate-persisting-as-an-enum

반응형