在 JPA/Hibernate 中持久化映射到 MySQL 视图的实体

Posted

技术标签:

【中文标题】在 JPA/Hibernate 中持久化映射到 MySQL 视图的实体【英文标题】:Persisting Entities Mapped to MySQL View in JPA/Hibernate 【发布时间】:2013-04-17 11:08:02 【问题描述】:

我有一个实体 Customer,它映射到一个视图,该视图定义为我的数据库中 Customer、Account 和 Person 之间的一系列连接。

我使用 JSF 2.0 和 Hibernate 设置的 JPA。后备数据库是 mysql

我的问题是,鉴于我的客户实体已映射到数据库视图这一事实,这会使新客户实体的持久化变得多么复杂?

【问题讨论】:

【参考方案1】:

我引用 Adam Bien 的书:

“对于 SQL 查询,视图和表之间没有区别,因此您可以轻松地将 JPA 实体透明地映射到视图。Java 端的代码保持简洁 – 您甚至可以获得更好的性能。有缺点:并非所有视图都是可更新的。视图是否可更新很大程度上取决于复杂性和特定数据库。例如,在 Derby DB 中,所有视图都不可更新。"

http://www.dzone.com/links/r/mapping_jpa_entities_to_sql_views_it_works_even_w.html

【讨论】:

所以在我尝试之前我可能不知道我的视图是否可以更新,本质上?但理论上它应该不会造成问题? 我今天刚刚更新了一个带有 oracle 数据库的视图中的值,它起作用了 我已尝试设置视图,但无法为实体 ID 设置 @GeneratedValue,但出现错误“无法构建 EntityManagerFactory [...] 原因:java.io .IOException: Broken pipeCaused by: java.io.IOException: Broken pipe" 所以我假设我需要在直接映射到数据库表的实体中生成 ID,然后通过视图进行更新,不是吗? (对不起,我是这个数据库的新手) 使用 MySQL,我有一个模型映射到一个简单的 SELECT * FROM model_table 视图,modelDAO.save(model) 更新了视图以及底层的 model_table ... 对我来说似乎很奇怪跨度>

以上是关于在 JPA/Hibernate 中持久化映射到 MySQL 视图的实体的主要内容,如果未能解决你的问题,请参考以下文章

如何用 JPA/Hibernate 映射 XMLType

JPA / Hibernate可以与其他持久性框架(如jOOQ)结合使用

Spring boot之 JPA/Hibernate/Spring Data

JPA(Hibernate)

7. JPA - Hibernate

Spring4.x Jpa + hibernate的配置(废弃JpaTemplate)