两个表格如下:
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的注释(并且不在可嵌入对象中引入父引用),是否有一种不太笨拙的方法来执行此映射?
将此与使用@Embeddable
和@ElementCollection
引用@CollectionTable
对象集合的方式进行比较。
答案 0 :(得分:2)
很抱歉无法提供最新答案,但是这个问题使我很感兴趣,因此我认为我会对此加以解决。
一种更优雅的解决方案是使open(filename_new, 'a')
的内容成为实体而不是可嵌入对象,并使用OneToOne关系而不是嵌入式对象。您还需要记住使用bar
而不是@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
中用fooId
之类的名称指定Bar
的列名。