我目前正在尝试学习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
}
相关的问题)。
希望任何人都觉得这个解决方案很有用。
答案 0 :(得分:0)
你可以使用"枚举"注释
Eventos