java - 在单独的表中映射 @Embeddable

标签 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 的注释(并且不在可嵌入对象中引入父引用)?

将此与使用 @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/

相关文章:

java - ActorContext(getContext())可以在Actor外部传递来创建子actor吗?

java - 我的 jar 文件运行但没有任何结果

java - 使用 hibernate 将 Postgres 几何读入字节 []?

hibernate - Hibernate和H2 “Referential integrity constraint violation”用于一对多双向映射

java - JPA实体设计/无法删除实体

java - Apache POI 在 Excel 中的单元格内创建行或表格

java - 如何在 Spring Boot 中设置 session 属性?

java - @NamedStoredProcedureQuery 不适用于 Hibernate 5.1.x 和 JPA2.1

java - Intellij 13 EclipseLink 类 [] 未找到错误

java - 为什么在 JPA 实体关系中使用 @Many-to-one?