2017-05-11 4 views
1

현재 최대 절전 모드를 배우려고하고 있으며 OOP와 DB 관점 모두에서 합당한 것으로 보이는 문제가 발생했지만 해결 방법을 찾을 수 없습니다.enum이있는 최대 절전 모드 룩업 테이블

내 자바 부분은 더 많거나 적은 같은 같습니다

@Entity 
@Table (name = "Vehicles") 
class Vehicle { 
    @Id 
    @Column (name = "UUID") 
    UUID id; 
    VehicleType type 

    (getters, setters, other values, etc.) 
} 

enum VehicleType { 
    TRUCK, 
    TRAILER, 
    OTHER; 
} 

내 DB 부분은 두 개의 테이블이 있습니다 - 차량 유형에 대한 차량 조회 테이블 하나

차량

UUID VARCHAR (PK) 
vehicle_type_id INT (FK to VehicleTypes) 

차량 유형

vehicle_type_id INT (PK) 
vehicle_type VARCHAR 

제 질문은 제시된 방식으로 이것을 배열 할 수 있습니까? 가능한 경우 구현 방법 (주석 등). 그렇지 않다면 유사한 구조를 구현하는 가장 좋은 방법은 무엇입니까?

----- 나는 내 목표 앤서니 파트 리 설명 solution를 사용하여 (더 이하)를 달성하기 위해 관리해야 -----

편집 할 수 있습니다. 자바 부분은 다음과 같습니다 동안

DB 부분은 동일한 체재 :

@Entity 
@Table (name = "Vehicles") 
class Vehicle { 
    @Id 
    @Column (name = "UUID") 
    UUID id; 
    @Column (name = "vehicle_type_id") 
    @Type (type = "VehicleEnumUserType") 
    VehicleType type 

    (getters, setters, other values, etc.) 
} 

enum VehicleType { 
    TRUCK(1), 
    TRAILER(2), 
    OTHER(0); 

    private int value; 
    VehicleType(int value){ 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 

    public static VehicleType fromValue(int value){ 
     for (VehicleType type : VehicleType.values()){ 
      if (value == type.value) return type; 
     } 
     throw new IllegalArgumentException("Value not mapped by VehicleType enum"); 
    } 
} 

VehicleEnumUserType implements UserType{ 
    private static final int[] SQL_TYPES = {Types.INTEGER}; 

    public Object nullSafeGet(ResultSet resultSet, String[] strings, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) 
      throws HibernateException, SQLException { 
     int number = resultSet.getInt(strings[0]); 
     return resultSet.wasNull() ? null : VehicleType.fromValue(number); 
    } 

    public void nullSafeSet(PreparedStatement preparedStatement, Object o, int i, SharedSessionContractImplementor sharedSessionContractImplementor) 
      throws HibernateException, SQLException { 
     if (o == null){ 
      preparedStatement.setNull(i, Types.INTEGER); 
     } else { 
      preparedStatement.setInt(i, ((VehicleType)o).getValue()); 
     } 
    } 
    // other mandatory methods required by UserType interface 
} 

이 솔루션은 내 요구 사항에 맞는 - 차량 종류는 자바 측 (에 의해 (조회 테이블 제한에 의해) DB 측 모두 제한된다 VehicleType 열거 형). 또한 차량 유형은 정수로 저장되므로 데이터를 저장하는 데 필요한 공간이 줄어 듭니다. 이 솔루션은 새로운 차량 유형 (예 : EnumType.ORDINAL과 관련된 문제)을 매우 안전하게 추가 할 수 있도록 해 줍니 다.

누군가가이 솔루션을 유용하게 사용할 수 있기를 바랍니다.

답변

0

당신은 "열거"주석을 사용할 수 있습니다

@Enumerated(EnumType.STRING) 
VehicleType type 
+0

하지만이없는 (그리고 내가하고 싶지 않아요) 차량 테이블의 차량 _ 열. vehicle_type_id 만 있고이 두 가지 데이터를 Vehicle 객체에 연결하는 방법을 모릅니다. –

+0

은 vehicle_type 속성 또는 속성의 조합입니까? –

+0

지금까지는 위에서 제시 한 것과 같은 열거 형입니다. –