如果 ORM(JPA、Hibernate 等)是邪恶的,Java-er 应该使用一些东西

Posted

技术标签:

【中文标题】如果 ORM(JPA、Hibernate 等)是邪恶的,Java-er 应该使用一些东西【英文标题】:Java-er should use something if ORM (JPA, Hibernate, etc) is evil 【发布时间】:2015-04-21 05:31:20 【问题描述】:

我一定对 ORM 和 JDBC(SpringJDBC 等)感到困惑。

有时我喜欢 ORM,因为对我来说它是 SQL 的简化版本。它帮助我处理我的关系模型。

例如:

场景

这里我有几个模型在课堂Tourism

class Hotel ..

class Schedule  ... List<Hotel> hotels; ...

class Product ... List<Schedule> schedules; ...

我的业务逻辑比较复杂;因此,类级别大于4,字段太多。

想象一下使用 SQL 进行 SAVE 或 UPDATE - 这太疯狂了!

也许我应该在 html 部分中将提交产品基础信息和时间表等分开。

有时我喜欢 SQL,因为它强大、高效。当然,这取决于所使用的数据库类型。

SQL支持RECURSIVE QUERY,解决“区域”等“树”查询。

SQL 调试很友好。错误只是错误而不是乱七八糟的错误提示。

它们都在我的项目中。

ORM 使用关系模型,而 SQL 使用复杂的建模,如树、报表等。

但我认为这在项目中是一团糟(同样的方法使用 SQL 和 JPA)。

JPA 有时要么不工作,要么有些麻烦。所以我认为 SQL 更好。

我的断言有误吗?还有其他方法吗?

如果SQL更好,那么如何处理DAO中的复杂关系,

比如下面的?

INSERT INTO a      (id, name) VALUES (1000,'a');
INSERT INTO a_b    (id, a,name) VALUES (10, 1000, 'b1'), (20, 1000, 'b2');
INSERT INTO a_b_c  (id, a, b, name) VALUES (1, 1000, 10, 'c1'), (2,1000, 20, 'c2');

我为我的英语道歉。我希望你能理解我到目前为止。 :)

【问题讨论】:

看看jOOQ。它提供了第三种有趣的方式:Typesafe SQL。 "ORM 使用关系模型,而 SQL 使用像树这样的复杂建模" - 没有意义。 SQL 是围绕关系模型的思想构建的。另外:ORM 使用面向对象 关系模型。在您的 Java 代码中,您不再看到关系模型 - 只有对象模型 @a_horse_with_no_name: “在您的 Java 代码中,您再也看不到关系模型了 - 只有对象模型” - Which some claim is the same thing 【参考方案1】:

您可以在同一数据访问层中使用both JPA (e.g. Hibernate) and SQL (e.g. jOOQ)。

    Hibernate 允许您在添加/删除实体属性时动态更新所有 DML 语句。实体图模型方便写操作,concurrency control mechanisms 可以防止lost updates。

    SQL(一般)和 jOOQ(特别是)是充分利用当前底层数据库的必要条件。 SQL 确实很强大,仅仅因为您使用的是 ORM 工具,并不意味着您不必使用本机查询。对于需要window functions通用表表达式派生表表达式的读取操作和数据投影,您应该使用 SQL。

【讨论】:

以上是关于如果 ORM(JPA、Hibernate 等)是邪恶的,Java-er 应该使用一些东西的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA中@Transient@JsonIgnoreProperties@JsonIgnore@JsonFormat@JsonSerialize等注解解释

springboot~JPA把ORM统一起来

5 -- Hibernate的基本用法 --1 3 流行的ORM框架简介

springboot JPA

Hibernate之环境搭建及demo

JPA是啥?