2017-08-28 68 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'的表。 –