我有一个包含多个属性的表。 我希望有两个类来访问那些(独占)属性。
@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
答案 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;
}
然后你可以得到这个课程之一。在数据库中,它看起来像普通表。