我有一堂课
@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 时出现问题class MyStringProperty extends MyAbstractProperty<String>{}
。
我了解到,默认情况下休眠只存储最多 255 个字符的字符串(请参阅:JPA:“列的数据太长”不会改变)。因此我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<>.
}
我如何确保这一点,因为默认值已经在 中定义MyAbstractProperty
?我不认为将类型注释移动到是可以的,MyAbstractProperty
因为这可能会对其他类(如MyLongProperty
.
例如,当我@Lob
在MyAbstractProperty
SQL 定义中MyStringProperty
设置 includeDEFAULTVALUE BLOB(255)
而不是DEFAULTVALUE BIGINT
.
附加问题:将列定义为文本数据似乎有不同的选项(例如@Type(type="org.hibernate.type.StringClobType")
,@Lob
)这些选项的主要区别在哪里。拿什么最好。(我的主数据库是 HyperSQL,但我也针对 SQLite、MariaDB 和 MySQL)。
编辑
根据最近的反馈,似乎解决方案可能是抽象的 getter/setter。我必须检查这对我的代码有什么影响。
我有一个替代方案 - 尚未完成 - 想法,这可能会导致对我的代码的修改更少。是否可以定义一个类
class MyText extendes String;
例如所有实例MyText
都自动存储为@Lob
?比我只需要修改MyAbstractProperty<String>
为MyAbstractProperty<MyText>
.