我有一个班级
canvas.delete(canvas.find_closest(x, y, halo=5))
这是@MappedSuperclass
public abstract class MyAbstractProperty <T extends Object>{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Column(name="defaultValue")
protected T defaultValue;
//...
}
等子类的基础。
这很好用。当我想在课程class MyLongProperty extends MyAbstractProperty<Long>{}
中存储Text时会出现问题。
我已经了解到,默认情况下,hibernate只存储最多255个字符的字符串(参见:JPA: "Data too long for column" does not change)。因此,我的class MyStringProperty extends MyAbstractProperty<String>{}
需要一个额外的注释,如:
defaultValue
我如何确保这一点,因为@Entity
class MyStringProperty extends MyAbstractProperty<String>{
@Type(type="org.hibernate.type.StringClobType")
@Column(name="defaultValue")
protected String defaultValue; // problem since defaultValue is already defined in MyAbstractProperty<>.
}
已经定义了defaultvalue?我不认为将类型注释移动到MyAbstractProperty
是可以的,因为这可能会对MyAbstractProperty
等其他类产生副作用。
例如,当我在MyLongProperty
中设置@Lob
时,MyAbstractProperty
的SQL定义包含MyStringProperty
而不是DEFAULTVALUE BLOB(255)
。
其他问题:将列定义为文本数据似乎有不同的选项(例如DEFAULTVALUE BIGINT
,@Type(type="org.hibernate.type.StringClobType")
)这些选项的主要区别在哪里。最好采取什么。 (我的主要数据库是HyperSQL,但我也针对SQLite,MariaDB和MySQL)。
修改
根据最近的反馈,似乎解决方案可能是抽象的getter / setter。我必须检查对我的代码有什么影响。
我有一个替代 - 没有完成 - 的想法,这可能会导致我的代码修改较少。是否可以定义一个类
@Lob
例如class MyText extendes String;
的所有实例都自动存储为MyText
?
我只需将@Lob
修改为MyAbstractProperty<String>
。
答案 0 :(得分:2)
您只能在超类中留下一个抽象的getter,并在子类中定义该字段:
@MappedSuperclass
public abstract class MyAbstractProperty<T extends Object>{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
public abstract T getDefaultValue();
}
@Entity
class MyStringProperty extends MyAbstractProperty<String>{
@Type(type="org.hibernate.type.StringClobType")
@Column(name="defaultValue")
protected String defaultValue;
@Override
public String getDefaultValue() {
return defaultValue;
}
}
为了避免对所有其他不需要特殊处理的情况进行样板处理,您可以简单地创建另一个包含默认映射的抽象类,然后从中扩展其他实体:
@MappedSuperclass
public abstract class MyDefaultProperty<T> extends MyAbstractProperty<T extends Object> {
@Column(name="defaultValue")
protected T defaultValue;
@Override
public T getDefaultValue() {
return defaultValue;
}
}