两个表如:
CREATE TABLE foo (
id INT PRIMARY KEY,
x TEXT
);
CREATE TABLE bar (
foo_id INT REFERENCES foo (id) ON DELETE CASCADE,
y TEXT,
z TEXT
);
...可以这样映射:
@Table(name = "foo")
@SecondaryTable(name = "bar", pkJoinColumns = @PrimaryKeyJoinColumn(name = "foo_id", referencedColumnName = "id"))
class Foo {
@Id
int id;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "y", column = @Column(table = "bar")),
@AttributeOverride(name = "z", column = @Column(table = "bar"))
})
Bar bar;
}
@Embeddable
class Bar {
String y;
String z;
}
有没有更简单的方法来完成这个映射,要么只使用标准 JPA 注释,要么使用特定于 Hibernate 的注释(并且不在可嵌入对象中引入父引用)?
将此与使用 @ElementCollection
和 @CollectionTable
引用一组 @Embeddable
对象的轻松程度进行比较。
最佳答案
抱歉回答晚了,但我对这个问题很感兴趣,所以我想我会尝试一下。
一个更优雅的解决方案是使bar
的内容成为Entity 而不是Embeddable,并使用OneToOne 关系而不是Embedded。您还需要记住使用 @PrimaryKeyJoinColumn
而不是 @JoinColumn
:
@Entity
@Table(name = "bar")
class Bar {
@Id
int fooId;
String y;
String z;
}
...
@Entity
@Table(name = "foo")
class Foo {
@Id
int id;
@OneToOne
@PrimaryKeyJoinColumn
Bar bar;
}
最大的好处是Foo
不再需要知道Bar
的内容。根据数据库的命名策略,您可能还需要在 Bar
中指定 fooId
的列名称,例如 @Column(name = "foo_id")
.
关于java - 在单独的表中映射 @Embeddable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43599840/