2017-02-27 120 views
1

我有一個類休眠:附加註釋列從繼承

@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設定@LobMyStringProperty 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>

+0

我認爲你需要遵循繼承策略之一,所以請閱讀這篇文章http://www.thejavageek.com/2014/ 05/14/jpa-single-table-inheritance-example/ –

+0

因此,大多數情況下,您需要在您的抽象類中使用@Inheritance註釋和您想要的策略 –

+0

另外我認爲您應該從MyStringProperty中移除defaultValue,因爲它已經在超類中並移動了@Type(type =「org.hibernate.type .StringClobType「)到MyAbstractProperty –

回答

1

你可以留在超只是一個抽象的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; 
    } 
} 
+0

謝謝你Dragan Bozanovic爲你的答案。這似乎有可能通過我的代碼中的一些重構將是必需的。請檢查我的問題的編輯。也許這個想法可能導致更簡單的解決方案? – BerndGit

+0

@BerndGit你不能從'String'擴展,它是一個最終的類。即使可以,效果也是一樣的,因爲您需要將'@ Lob'註釋放在包含類中的MyText類型的字段上。 –