这是我定期处理的事情,第一次是我需要信念。幸运的是,我只是尝试过,额外努力学习并感谢this book,Spring支持和Hibernate我不会在不考虑JPA的情况下启动项目。但并不是每个人都愿意经常加倍努力(就在我猜的任何事情中)。那么如何以及如何说/提出/解释/论证至少改变他们对ORM的态度?
答案 0 :(得分:4)
我假设你实际上有一个比单纯的DTO更丰富的对象模型,而不仅仅是与你的关系模式的1:1对应关系。如果没有,你就不会赢得争论。
如果Hibernate生成的SQL至少与存储过程中的手动编码内容一样有效,那么你就赢了。
如果可以优化存储过程以比Hiberate生成的SQL更好地执行,则会丢失。
如果数据库由依赖于存储过程的其他应用程序共享,则会丢失。您不能轻易地将逻辑移动到Spring和中间层。
如果您的应用拥有数据库,您会有更好的案例。
由于您已经在使用Spring,这表明您有一个利用Spring Validation的DAO层。 PreparedStatements已在下面使用,因此Spring注入与存储过程一样不太可能。
答案 1 :(得分:3)
存储过程是一个抽象层。 JPA要求您了解基础表结构。存储过程/函数掩盖了;你只需要知道要调用的过程或函数以及它的返回类型。
JDBC使用Connection对象的prepareCall方法调用存储过程非常简单。
存储过程还增加了一层安全性:应用程序本身通常无法手动修改表,只调用执行修改的过程。 SP / SF也应该验证传递给它的参数。
存储过程的主要缺点是将数据退出...您需要创建自己的工具来映射返回到Java对象的数组和结构,通常使用type Map和特殊的以编程方式创建的对象来实现SQLData
界面。
答案 2 :(得分:2)
那么如何以及如何说/提出/解释/论证至少改变他们对ORM的态度?
询问他们是否要为您添加到应用程序中的每个新实体类型继续编写相同的样板SQL JDBC CRUD代码。
如果数据层中没有ORM解决方案,则每个新实体类都需要N个工作单元才能通过数据层(DAO,CRUD代码,存储过程,编写查询等)使该实体可用。
ORM将N转换为自身的一小部分,假设添加新实体然后要求您只在元数据中为该实体添加另一个映射。
答案 3 :(得分:1)
更少的样板和额外的安全性。你可以保存你的手指,初级程序员引入SQL注入漏洞的机会较少,我发现这些漏洞非常重要。
答案 4 :(得分:1)
我认为来自相关问题链接的this answer指出了潜在的问题。如果数据库的目的与您的应用程序紧密耦合,并且它实际上没有单独的标识,那么ORM就会有很多意义。
但是,如果您的数据库代表了更大的图片并且您的应用程序是访问数据的众多应用程序之一,则使用ORM可能会对应用程序与数据库之间的耦合产生潜在的负面影响,并且需要更改数据库时间。
但在某种程度上,你可以自己回答你的问题 - 你有什么反对意见?你是如何第一次说服的?
答案 5 :(得分:1)
你的问题的答案实际上非常简单,完全独立于你是否是一个顽固的DBA。你必须问自己:
您是否正在编写以大量CRUD为中心的以域模型为中心的应用程序?
或者您是在编写以关系模型为中心的应用程序而不是那么多的CRUD?
在第一种情况下,选择一个ORM。在第二种情况下,选择SQL。如果您的应用程序中同时包含两者,请选择两者。虽然ORM 对您的应用程序设计施加了很多规则,但这两个模型并不相互排斥。
请注意,Java世界中的ORM不是“下一件事”。它们是一个伟大的发明,只能解决一些问题(即复杂或重复的CRUD)
答案 6 :(得分:0)
ORM在应用程序中出错的机会减半,而在存储过程中出错的机会则翻倍。
如果应用程序中存在错误,则必须考虑:是代码还是该存储过程中的某些内容。
此外,如何隔离测试SP?
请记住,代码中的错误和数据库中的错误可以很好地加倍创建一个可行的解决方案。就像数学中的两个否定词如何产生正数一样。如果在不固定代码的情况下固定了SP,就会变得混乱,反之亦然。