2017-08-28 149 views
2

我有相同的字段的兩個對象,而是從不同的表(事實上foo_something和bar_something不是簡單的表格,有幾個結果連接操作)。我使用@Subselect hibernate註釋來獲取數據。我可以做這樣的班級結構,但哪些工作正常?此類結構不起作用,因爲註釋不會繼承。如果我使用@Inheritance註解,我得到錯誤Unknown column foo_somethingca0.DTYPE休眠子選擇與類繼承

class Something { 

    @Id @Column Long id; 
    @Column String name; 
    @Column String description; 

    //getters, setters, constructors 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM foo_something") 
class FooSomething extends Something { 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM bar_something") 
class BarSomething extends Something { 

} 

UPD。

謝謝,@HenryMartens,我加了註釋@Entity@InheritanceTABLE_PER_CLASS戰略,並提出了抽象類,現在它的正常工作:

@Entity 
@Inheritance(strategy = TABLE_PER_CLASS) 
abstract class Something { 

    @Id @Column Long id; 
    @Column String name; 
    @Column String description; 

    //getters, setters, constructors 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM foo_something") 
class FooSomething extends Something { 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM bar_something") 
class BarSomething extends Something { 

} 

回答

1

在Hibernate中DTYPE是鑑別列。它用於區分一些對象,它們與您的示例一樣保存在同一個數據庫表中。 你可以用@DiscriminatorColumn添加註釋的鑑別列。

在具體的類可以使用@DiscriminatorValue設置鑑別列的值註釋類。

例如:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20) 
class abstract Something { 

    @Id 
    @Column 
    Long id; 

    @Column 
    String name; 

    @Column 
    String description; 

    //getters, setters, constructors 
} 

@Entity 
@Table("FOO_SOMETHING") 
@Immutable 
@DiscriminatorValue("FooSomething") 
class FooSomething extends Something { 

} 

@Entity 
@Table("BAR_SOMETHING") 
@Immutable 
@DiscriminatorValue("BarSomething") 
class BarSomething extends Something { 

} 
+0

我的基類'Something' - 它不是一個表,它與領域,getter和setter方法,我不想'BarSomething'複製的列表簡單的基類和'FooSomething',這就是爲什麼我不能在基類的原因'SchemaManagementException使用'@ Table'註釋:架構驗證:缺少表[SOMETHING]'。這個類是一個抽象。 –

+0

@Denis Gavrus然後,你必須讓你的'Something'類抽象。你可以使用'InheritanceType.TABLE_PER_CLASS'來獲取每個'FooSomething'和'BarSomething'的表。 –