带有枚举的Hibernate查找表

时间:2017-05-11 10:25:38

标签: hibernate enums lookup-tables

我目前正在尝试学习hibernate并且从OOP和DB的角度来看遇到了一个看起来合理的问题,但我无法找到解决方案。

我的java部分或多或少看起来像这样:

@manager.command
def syncdb():
    User.metadata.create_all(db.engine)

manager.add_command('server', Server(host='192.168.33.15'))
manager.add_command('shell', Shell(make_context=_make_context))

from pixelpin_auth_flask_sqlalchemy import models
models.PSABase.metadata.create_all(db.engine)

if __name__ == '__main__':
    manager.add_command("runserver", Server(
    use_debugger = True,
    use_reloader = True,
    host = '192.168.33.15'))
    manager.run()

我的DB部分有两个表 - 一个用于车辆,另一个用于车辆类型的查找表:

车辆

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

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

enum VehicleType {
    TRUCK,
    TRAILER,
    OTHER;
}

VehicleTypes

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

我的问题是,是否可以以呈现的方式安排这个?如果可能,如何实现它(注释等)。如果没有,实现类似结构的最佳方法是什么?

----- ----- EDIT

我已经设法使用Anthony Patricio描述的solution来实现我的目标(或多或少)。

数据库部分保持不变,而Java部分看起来像这样:

vehicle_type_id INT (PK)
vehicle_type VARCHAR

此解决方案符合我的要求 - 车辆类型在DB端(通过查找表限制)和java端(通过VehicleType枚举)受到限制。此外,车辆类型存储为整数,减少了存储数据所需的空间。最后但不要求,此解决方案允许非常安全地添加新的车辆类型(例如与@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 } 相关的问题)。

希望任何人都觉得这个解决方案很有用。

1 个答案:

答案 0 :(得分:0)

你可以使用"枚举"注释

Eventos