【问题标题】:JPA One Entity with two table via SecundaryTable通过 SecundaryTable 具有两个表的 JPA 一个实体
【发布时间】:2019-04-17 08:22:29
【问题描述】:

我无法使用以下简化设置。我只想使用标准 API 获取 ONE 类中表的两个值。我不想将两个类与@OneToOne 或@OneToMany 等一起使用。

这可能吗? JPA 不打算这样做吗?

第一个表:

test.table_1(
  id integer,
  value_1 text,
  table_2_id integer
)

第二桌:

test.table_2(
  id integer,
  value_2 text
)

实体类:

@Entity
@Table(schema = "test", name = "table_1")
@SecondaryTable(schema = "test", name = "table_2", pkJoinColumns = {
    @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "table_2_id")
})
public class JointEntity {
  @Id
  private Integer id;
  @Column(name = "value_1")
  private String value1;
  @Column(name = "value_2", table = "table_2")
  private String value2;

  // getter and setter
}

执行时抛出异常:

Exception in thread "main" org.hibernate.cfg.RecoverableException: Unable to find column with logical name: table_2_id in org.hibernate.mapping.Table(test.table_1) and its related supertables and secondary tables
    at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:831)
    at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:608)
    at org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder.java:794)
    at org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:786)
    at org.hibernate.cfg.annotations.EntityBinder.finalSecondaryTableBinding(EntityBinder.java:714)
    at org.hibernate.cfg.SecondaryTableSecondPass.doSecondPass(SecondaryTableSecondPass.java:29)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1586)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at de.icybits.test.HibernatePerformanceTest.main(HibernatePerformanceTest.java:18)
Caused by: org.hibernate.MappingException: Unable to find column with logical name: table_2_id in org.hibernate.mapping.Table(test.table_1) and its related supertables and secondary tables
    at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:826)
    ... 14 more

【问题讨论】:

  • 辅助表的 PK 与所属表的 PK 相同。您在拥有表中没有一些额外的列。任何基本的 JPA 文档都会告诉你这个datanucleus.org:15080/products/accessplatform_5_2/jpa/…
  • 不错的指南。谷歌确实提供了很多不相关和冗余的信息,所以我错过了这个微小的信息。感谢那。因此,如果 SecundaryTable 不是正确的选择。你有关于如何让这个设置工作的提示吗?

标签: hibernate jpa criteria jpa-annotations


【解决方案1】:

就像 Billy Frost 在他的推荐中提到的那样,@SecundaryTable 并不打算以这种方式使用。所以我做了进一步的研究。因为比利弗罗斯特的评论没有完全回答我的问题。

  1. 是否可以存档上述设置(1 实体中的 2 表)?

答案是肯定的,我在另一个问题 Hibernate - Join only single column instead of whole entity 中找到了解决方法

  1. JPA 不打算这样做吗?

正如我在 1 中提到的,这只是一种解决方法。一般来说,它不打算将单个外部列与实体关联。 (我不是 100% 确定这一点,但经过进一步研究,这就是我得出的结论。)

最后,我要感谢 Billy Frost 的快速评论。因此,我将@SecundaryTable 排除在我的研究之外,并且可以找到更好的答案。

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多