【问题标题】:Can I have an entity that only maps to some columns of a table?我可以拥有一个仅映射到表的某些列的实体吗?
【发布时间】:2016-07-11 04:28:30
【问题描述】:

我正在制作一个数据库迁移工具,并且正在处理一个非常笨拙的源数据库。它基本上是一张有 40-50 列以上的巨型表。然而,并非所有这些专栏对我都有用。我只想要十几个左右。获得该数据后,我将向 Web 服务发出请求,该服务将处理迁移目标端的所有内容。

我的选项基本上是手动创建查询以仅选择我想要的列,或者创建一个映射我想要的列的实体。我对使用 JPA 并不是很熟悉,所以我不确定这是否可行。

我可以做类似的事情

@Entity
class SomeEntity{

    @Column(name = "ColumnA")
    private String columnA;
    @Column(name = "ColumnB")
    private String columnB;
}

如果数据库中的列是,例如

Column A | Column B | Column C | Column D

EclipseLink 会仅映射我注释的列,还是会抱怨尝试将数据库中的列映射到我的实体中不存在的字段?我知道@Transient 将标记不应保留的字段。但我想做相反的事情,忽略数据库列,只将表部分映射到一个类。

【问题讨论】:

  • 如果它们是只读的,您可以只将几列映射到实体,这没有问题。仅获取您在@Entity 中声明的那些列。为了安全起见,请设置 setter protected 以在应用程序级别强制执行不变性。
  • 基本上是的,但无论如何您都必须定义一个@Id(或等效项)。无需像已接受的答案中建议的那样在数据库级别创建视图。

标签: java jpa jakarta-ee eclipselink entitymanager


【解决方案1】:

你应该创建一个视图。让视图包含您认为相关的尽可能多的列。将这些列定义为类中的字段,并像往常一样使用休眠注释连接这些列。但请注意,您只能在视图上执行选择,因此插入/更新/删除是不可能的。

【讨论】:

  • 海量表是只读的,所以只执行选择就可以了。您能否详细说明一下什么是视图?在我上面的例子中会发生什么?
  • @JMD83 视图是在数据库级别创建的,除非必须加入某些表,否则您真的不需要它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2014-11-17
  • 1970-01-01
  • 2021-04-08
  • 2021-01-01
  • 2011-09-01
相关资源
最近更新 更多