我有一個類休眠:附加註釋列從繼承
@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>{}
基礎。 這工作正常。當我想將文本存儲在類class MyStringProperty extends MyAbstractProperty<String>{}
中時,問題就出現了。
我已經瞭解到,每個默認存儲區的hibernate只存儲最多255個字符的字符串(請參閱:JPA: "Data too long for column" does not change)。因此,我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
等其他類有副作用。
例如,當我在MyAbstractProperty
設定@Lob
的MyStringProperty
SQL定義包括DEFAULTVALUE 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>
。
我認爲你需要遵循繼承策略之一,所以請閱讀這篇文章http://www.thejavageek.com/2014/ 05/14/jpa-single-table-inheritance-example/ –
因此,大多數情況下,您需要在您的抽象類中使用@Inheritance註釋和您想要的策略 –
另外我認爲您應該從MyStringProperty中移除defaultValue,因爲它已經在超類中並移動了@Type(type =「org.hibernate.type .StringClobType「)到MyAbstractProperty –