Hibernate和两个类映射到单个表

时间:2017-05-31 13:07:41

标签: java spring hibernate spring-boot spring-data

我有一个包含多个属性的表。 我希望有两个类来访问那些(独占)属性。

@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 Data存储库保存Foo时:

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

我得到fooValue设置为null的例外情况。我在日志中看到了NULL fooValue的插入内容。我稍微调试了一下,当我从项目中删除Bar时,保存工作,当我再次添加它时,Foo停止工作。

对我而言,即使我尝试保存Bar,看起来Hibernate也会选择Foo类。为什么呢?

我的堆栈是:Spring Boot 1.5.3,Spring Data,Hibernate 5.x

2 个答案:

答案 0 :(得分:0)

坦率地说,我从未见过以这种方式由两个实体映射的同一个表。

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

基础实体

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

Foo实体

@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; 
}

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

答案 1 :(得分:0)

如果你想避免继承,你也可以使用适当的字段(如FOO和BAR)构建两个不同的类,使它们成为@Embeddable并制作一个额外的类:

class SuperFoo {
   //make some ID

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

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

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