在单独的表中映射@Embeddable

时间:2017-04-25 00:54:08

标签: java hibernate jpa

两个表格如下:

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对象集合的方式进行比较。

1 个答案:

答案 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的列名。