Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA与JDBC、存储过程等的对比,还是如何说服老派程序员尝试ORM?_Java_Database_Orm_Jpa_Jdbc - Fatal编程技术网

Java JPA与JDBC、存储过程等的对比,还是如何说服老派程序员尝试ORM?

Java JPA与JDBC、存储过程等的对比,还是如何说服老派程序员尝试ORM?,java,database,orm,jpa,jdbc,Java,Database,Orm,Jpa,Jdbc,这是我定期处理的事情,第一次是我需要信念。幸运的是,我刚刚尝试了,做了额外的努力来学习,多亏了,Spring支持和Hibernate,我不会在不考虑JPA的情况下启动一个项目。但并不是每个人都愿意如此频繁地付出额外的努力(我想只是在我们处理的任何事情上)。那么,如何以及怎样说/呈现/解释/论证来至少改变他们对ORM的态度呢 相关的: 那么,如何以及怎样说/呈现/解释/论证来至少改变他们对ORM的态度呢 询问他们是否希望继续为您添加到应用程序中的每个新实体类型编写相同的样板SQL JDBC CRU

这是我定期处理的事情,第一次是我需要信念。幸运的是,我刚刚尝试了,做了额外的努力来学习,多亏了,Spring支持和Hibernate,我不会在不考虑JPA的情况下启动一个项目。但并不是每个人都愿意如此频繁地付出额外的努力(我想只是在我们处理的任何事情上)。那么,如何以及怎样说/呈现/解释/论证来至少改变他们对ORM的态度呢

相关的:

那么,如何以及怎样说/呈现/解释/论证来至少改变他们对ORM的态度呢

询问他们是否希望继续为您添加到应用程序中的每个新实体类型编写相同的样板SQL JDBC CRUD代码

如果数据层中没有ORM解决方案,每个新的实体类都需要N个工作单元才能使该实体通过数据层可用(DAO、CRUD代码、存储过程、编写查询等)


ORM将N转换为自身的一小部分,假设添加新实体需要您在元数据中为该实体添加另一个映射。

减少样板文件和额外的安全性。你可以省掉你的手指,而初级程序员引入SQL注入漏洞的机会就更少了,我发现这一点非常重要。

我认为,从你的相关问题链接中可以看出根本问题。如果数据库的用途与您的应用程序紧密耦合,并且它实际上没有单独的标识,那么ORM就非常有意义

但是,如果您的数据库代表了一幅更大的图景,并且您的应用程序是访问数据的众多应用程序之一,那么使用ORM可能会对应用程序和数据库之间的耦合以及随着时间的推移更改数据库的需要产生潜在的负面影响


但在某种程度上,你可以自己回答你的问题——你有什么反对意见?你第一次是怎么被说服的?

好吧,我在这里扮演魔鬼代言人

存储过程是一个抽象层。JPA要求您了解底层的表结构。存储过程/函数屏蔽;您只需要知道要调用的过程或函数及其返回类型

JDBC使用连接对象的方法使调用存储过程变得非常容易

存储过程还增加了一层安全性:应用程序本身通常不能手动修改表,只能调用进行修改的过程。SP/SF还应该验证传递给它的参数


存储过程的主要缺点是将数据返回。。。您需要创建自己的工具来映射返回Java对象的数组和结构,通常使用一个特殊的、以编程方式创建的对象来实现
SQLData
接口。

我假设您实际上拥有一个比DTO更丰富的对象模型,而不仅仅是与关系模式的1:1对应关系。如果不是,你就不会赢得这场争论

如果Hibernate生成的SQL至少和存储过程中手工编码的SQL一样高效,那么您就赢了

如果可以优化存储过程,使其比Hibrate生成的SQL执行得更好,则会导致失败

如果数据库由依赖于存储的进程的其他应用程序共享,则您将失败。您不能轻易地将逻辑移动到Spring和中间层

如果你的应用拥有数据库,你的情况会更好


由于您已经在使用Spring,这表明您有一个利用Spring验证的DAO层。PreparedStatements已经在下面使用了,因此SQL注入对于Spring和存储过程来说都是不可能的。

您的问题的答案实际上非常简单,并且完全独立于您是否是死硬的DBA。你必须问问自己:

您是否正在使用大量CRUD编写一个以领域模型为中心的应用程序

或者,您是在编写一个以关系模型为中心的应用程序,而没有那么多CRUD

在第一种情况下,选择一个ORM。在第二种情况下,选择SQL。如果应用程序中同时包含这两个选项,请同时选择这两个选项。这两个模型并不是相互排斥的,尽管ORMs确实在应用程序设计上强加了很多规则


请注意,在Java世界中,ORM不是“下一件事”。它们是一项伟大的发明,它只解决了一些问题(即复杂或重复的CRUD)

在应用程序中出错的机会减少了一半,而存储过程则使出错的机会增加了一倍

如果应用程序中有一个bug,您必须思考:是代码还是存储过程中的某些东西

此外,如何单独测试SP


请记住,代码中的一个bug和数据库中的一个bug可以很好地结合起来创建一个工作解决方案。就像数学中两个负数等于一个正数一样。当SP被修复而不修复代码时,情况就会变得混乱,反之亦然。

很难反驳的论点,但通常的反驳是“是的,但除了CRUD之外,我不能使用真正的数据库内容,等等。那么让我扮演反魔鬼的倡导者:SP不可移植,更难测试,更难重构,他们使得重用逻辑变得更加困难。。。对我来说,弊大于利。另请参阅存储过程的主要缺点是,它们将您的业务逻辑分布在基本层上;各层之间的合作也不太好,因为我们只限于遗留的JDBC;最终结果是加倍努力或抛弃业务层(这实际上是不可能的),从而使其不完整且不一致。我可以马上驳斥的关于数据库安全性的每一个争论都是将人们引向最佳实践——不管他们打算使用什么技术。但老实说,我不想把这变成JPA与JDBC的讨论:-)@grigory:不管你是否喜欢,这些可能是你必须反驳的论点。我不会