JPA:从视图更新表中读取

时间:2011-12-28 10:21:42

标签: java jpa

是否可以让JPA从视图中读取实体,然后更新表。

举个例子:

Sample Schema

我们有一个从SuppliersInvoice_VW读取的实体。 此视图和关联实体将包含InvoiceNo,SupplierCode, SupplierName 和值。

用户可以看到以下内容:

发票编号:1234
供应商:Joes'Hardware
价值:50

这让他意识到价值应该是509,所以他会相应更新

发票编号:1234
供应商:Joes'Hardware
价值:509

然后触发我们的SuppliersInvoice实体的更新。

我已映射@Table("SuppliersInvoice_vw"),这意味着它从SuppliersInvoice_vw读取数据,但这也意味着它将通过该视图进行更新。

有没有办法从视图中读取JPA( SuppliersInvoice_vw )并更新表格( SuppliersInvoice )?

备用策略是更新视图,但我始终建议不要这样做。这个建议是否具有性能基础,或者更多的是“了解通过视图更新时可能出现的问题”。

2 个答案:

答案 0 :(得分:1)

我之前遇到过与views / tables和Entities相同的问题。我不知道你正在使用什么后端数据库,但在我的情况下我运行的是PostgreSQL 9.x.为了解决这个问题,我在我的数据库中创建了触发器,允许我在我的视图中INSERT或UPDATE,然后通过触发器适当地更新视图后面的基础表。这样,您仍然可以更新您的SuppliersInvoice实体对象并像往常一样使用JPA保留更改,但后端数据库将根据您提供的更新适当地更新实际表。

以下是PostgreSQL 9.1中INSERT/UPDATE/DELETE rules文档的链接,以便您自己查看。

答案 1 :(得分:1)

我认为用JPA透明地完成你想做的事情是不可能的。

JPA规范只允许每@Table@Entity。处理这个问题最简单(也是最便携)的方法可能是有两个独立的@Entity类,一个用于视图,一个用于表,具有相似的属性,并根据是否根据上下文选择使用哪一个你正在读书或写作。

如果属性排成一行,则可以使用公共BeanUtils.copyProperties从视图中初始化可写对象。

基本上,无论将只读实体映射到数据库视图都像DTO一样,你可以这样对待它。