2017-05-11 8 views
1

私は現在、休止状態を学習しようとしており、OOPとDBの両方の観点から見て問題が発生しましたが、解決策を見つけることができません。enumのHibernateルックアップテーブル

私のJavaの部分は、多かれ少なかれ、このようになります。

@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の一部は、二つのテーブルがある - 車両タイプのための車とルックアップテーブルの1:

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

車種

vehicle_type_id INT (PK) 
vehicle_type VARCHAR 

私の質問は、提示された方法でこれを配置することは可能ですか?可能であれば、それを実装する方法(注釈など)。そうでない場合は、同様の構造を実装する最良の方法は何ですか?

----- ----- EDIT

私はアンソニー・パトリシオによって記述solutionを使用して私の目標(多かれ少なかれ)を達成するために管理しています。

Javaの部分は次のようになりながら

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側とJava側の両方で制限されていますVehicleType列挙型)。さらに、車種は整数として格納され、データの格納に必要なスペースが削減されます。この解決策は、新しい車両タイプ(例えば、EnumType.ORDINALに関連する問題など)の安全な追加を可能にするが、最後ではない。

誰でもこのソリューションが役立つことを願っています。

答えて

0

あなたは「列挙」のアノテーションを使用することができます

@Enumerated(EnumType.STRING) 
VehicleType type 
+0

しかし、私が持っていない(と私はしたくない)車の表の車両の種類列を。私はvehicle_type_idしか持っておらず、これら2つのデータをどのようにしてVehicleオブジェクトに結びつけるのか分かりません。 –

+0

はvehicle_type属性の文字列またはコンポジットですか? –

+0

今のところそれは上記のような列挙型です。 –

関連する問題