JPA 和表视图。能做到吗?

2022-09-01 07:48:08

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

现在,我们已被命令将视图用于所有内容。例如:如果我们有一个名为 PERMISSION 的表那么我们还需要一个名为 PERMISSION_VIEW 的视图。基本上,我们需要对每个表执行此操作,并且我们的应用程序只能通过查询视图来访问数据。

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

@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 表执行此操作。你到底如何将其整合到实体豆中?

答案 1

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

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


答案 2

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


推荐