如果 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等注解解释