私は現在、休止状態を学習しようとしており、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
に関連する問題など)の安全な追加を可能にするが、最後ではない。
誰でもこのソリューションが役立つことを願っています。
しかし、私が持っていない(と私はしたくない)車の表の車両の種類列を。私はvehicle_type_idしか持っておらず、これら2つのデータをどのようにしてVehicleオブジェクトに結びつけるのか分かりません。 –
はvehicle_type属性の文字列またはコンポジットですか? –
今のところそれは上記のような列挙型です。 –