2017-05-31 81 views
3

我有一个具有多个属性的表。 我想要有两个类来访问这些(独占)属性。休眠和两个类映射到单个表

@Entity 
@Table(name = "MY_TABLE") 
public class Foo { 

... 
    @Column 
    @NotNull 
    private String fooValue; 
} 

@Entity 
@Table(name = "MY_TABLE") 
public class Bar { 
... 
    @Column 
    private String barValue; 
... 
} 

基本上Bar是只读查看一些的值的在表中。 Foo用于更新其他值,Bar用于查看其他值(不是使用Java应用程序创建的)。

麻烦的是,当我尝试使用Spring的数据存储库,以节省Foo

public interface FooRepository extends JpaRepository<Foo, Long> { 
} 

我得到异常fooValue设置为null。我在日志中看到为NULL。我调试了一下,当我完全从项目中删除Bar保存工程,当我再次添加保存Foo停止工作。

因此,对我来说,即使在我试图保存Foo时,看起来Hibernate也会拿起Bar类。为什么?

我的堆栈是:春天引导1.5.3,春季数据,Hibernate的5.x的

+0

另外,你可能会考虑只使用懒惰抓取:) – Rjiuk

回答

0

坦白说,我从来没有见过的两个实体这种方式映射到同一个表。

通常你会定义一个继承的配置,并从那里工作:

基础机构

@Entity 
@Inheritance 
@DiscriminatorColumn(name="TABLE_TYPE") 
@Table(name="MY_TABLE") 
public class MyTable implements Serializable{ 
    @Id 
    @GeneratedValue 
    protected int id; 
    ... 
} 

美孚实体

@Entity 
@DiscriminatorValue("FOO") 
public class FooTable extends MyTable { 
    @Column 
    @NotNull 
    private String fooValue; 
} 

酒吧实体

@Entity 
@DiscriminatorValue("BAR") 
public class FooTable extends MyTable { 
    @Column 
    private String barValue; 
} 

这是单表继承策略,它似乎最适合您的情况。

+0

是的,我想避免做继承,因为这两个类没有太多共同点。数据在它们之间分开,因此它们不会重叠。所以我认为更简单的方法是有两个完全不同的类。我仍然困惑为什么hibernate无法区分它们。 –

+0

这种定义实体的方式肯定不在JPA规范中。休眠..至少最新版本严格遵守该规范..我没有在启动过程中抱怨,但运行时行为似乎不可预测 –

0

如果你想避免继承你也可以建立两个不同的班,就像FOO和BAR是正确的领域,使他们@Embeddable,使一个额外的类:

class SuperFoo { 
    //make some ID 

    @Embedded 
    @Basic(fetch = FetchType.LAZY) 
    Foo foo; 

    @Embedded 
    @Basic(fetch = FetchType.LAZY) 
    Bar bar; 
} 

然后,你可以得到这一个类。在数据库中它看起来像一个普通表。