【问题标题】:JPA and Table Views. Can it be done? [duplicate]JPA 和表视图。可以做到吗? [复制]
【发布时间】:2013-05-17 04:39:23
【问题描述】:

我们目前有一个 Java EE 系统,我们在其中使用 JPA 映射到我们的数据库。这是一个相当完善的系统,有大约 20 个实体。

我们现在被命令为所有事情使用视图。例如:如果我们有一个名为 PERMISSION 的表,那么我们还需要一个名为 PERMISSION_VIEW 的视图。基本上我们需要对每个表都这样做,而我们的应用程序只能通过查询视图来访问数据。

现在我们所有的实体 bean 看起来都是这样的:

@Entity
@Table(name = "PERMISSION")
@NamedQueries({
        @NamedQuery(name = "Permission.findByPK", query = "SELECT p FROM Permission p WHERE p.dpNum = :dpNumber"),
        @NamedQuery(name = "Permission.deleteAll", query = "DELETE FROM Permission") })
public class Permission implements Serializable {

}
  • 首先,如果只允许使用视图,如何更新表。物化视图可以解决这个问题吗?
  • 其次,如果我们只能使用视图,将需要多少重写?例如。对于每个实体,我们需要编写 @Table(name = "PERMISSION_VIEW") 来描述实体,但是,在进行更新时,它需要对 PERMISSION 表执行此操作。您到底是如何将其整合到实体 bean 中的?

【问题讨论】:

  • 请原谅题外话的问题,但为什么有人要这样做?
  • 我在一家大型组织工作,我们有一些来自某个地方的人写的一些数据库指南,说我们必须使用视图,以实现安全和管理目的。
  • 您的应用程序显然需要对数据库的写入权限。如果您的视图包含与表相同的数据,我看不出这会带来什么安全性或其他好处。
  • 我不得不给你的问题 +1 以供你评论。 “某个地方的某个人。[..] 为了安全。”

标签: java jakarta-ee jpa view ejb-3.0


【解决方案1】:

有关 JPA 和数据库视图的更多信息,请参阅 http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Views

在 JPA 中,您可以使用 @Table 注释映射到与表相同的 VIEW。然后,您可以将视图中的每一列映射到对象的属性。视图通常是只读的,因此对象到视图的映射通常也是只读的。在大多数数据库中,视图也可以根据它们封装的查询复杂程度进行更新。即使对于复杂的查询,通常也可以使用数据库触发器来更新视图。

【讨论】:

  • 我应该手动重新输入所有字段吗?是否可以让 JPA 自动推断它们?
【解决方案2】:

大多数现代 RDBMS 都支持可插入和可更新的视图。 如果您的 RDBMS 支持它,那么您应该没有任何问题。与表相同的视图在任何支持此类视图的 RDBMS 中都应该是可更新的。因此,您只需要更改映射并将表名替换为视图名即可。

【讨论】:

  • 只要 JPA 实现也支持视图(有些支持,DataNucleus JPA 肯定支持)
  • 我所知道的所有 JPA 实现都是基于 JDBC 的。无论 T 是表还是视图,SQL 语句都将是相同的(插入 T ...)。这就是为什么我认为它只依赖于 RDBMS 来支持可更新的视图,而 JPA 实现不需要知道它。除非我错过了什么。
猜你喜欢
  • 2015-08-27
  • 2015-06-21
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多