【问题标题】:Mapping an @Embeddable in a separate table在单独的表中映射 @Embeddable
【发布时间】:2017-04-25 00:54:08
【问题描述】:

两个表如:

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 对象集合的难易程度进行比较。

【问题讨论】:

  • 您不能简单地使用 @ElementCollection 映射它,但隐藏该实现细节,即不公开集合,而是提供操作集合的 set/getBar 方法吗?
  • 这也行,但比上面的冗长注释更难看:-)

标签: java hibernate jpa


【解决方案1】:

抱歉,回答晚了,但这个问题让我很感兴趣,所以我想我会尝试一下。

一个更优雅的解决方案是使bar 的内容成为一个实体而不是一个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")。

【讨论】:

  • 应该更清楚数据库架构是固定的(bar 没有唯一标识符),所以这个解决方案不起作用。
  • @ejain 在你的 DDL for Bar 你有这个:foo_id INT REFERENCES foo (id) ON DELETE CASCADE。这就是您需要的所有唯一标识符。如果您说该表(栏)中可以有多个行引用同一个 Foo 实体,那么即使您原来的 SecondaryTable 解决方案也行不通。如果 SecondaryTable 解决方案有效,那么这个解决方案也有效。
  • 您当前的解决方案失去了外键关系,并且只有在您手动将两个主键设置为相同值时才有效......只需将@PrimaryKeyJoinColumn替换为@MapsId @JoinColumn(name = "id"),我会接受你的解决方案!
  • 原始@Embedded 解决方案创建了一个与上面发布的DDL 匹配的外键;看起来使用@MapsId 允许我们拥有一个外键,而不必使关系成为双向的。
  • @MapsId 解决方案基于您的解决方案,不使用@Embedded 或@SecondaryTable。这可能是对这个注释的公然误用,但它似乎可以工作,并且不需要更改 Bar 域对象来引用回 Foo 对象。
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2020-05-06
  • 2013-10-02
  • 2020-05-12
  • 2016-07-05
  • 2012-09-25
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多