java JPA与传统原生SQL共存
我总是看到越来越多的java web应用程序使用ORM框架将实体映射到数据库,并显然使对象的序列化更容易
这看起来不错,通常涉及很多代码,比如:
@Entity
@Table(name="Flight")
public class Flight implements Serializable {
Long id;
@Id
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
}
上面将Flight POJO映射到名为Flight的数据库表,对于从头开始设计的新应用程序来说,这似乎非常合理
然而,当应用程序必须使用遗留表和逻辑开发时,使用像JPA这样的ORM解决方案是可行的解决方案吗
换句话说,是否可以同时使用ORM表和遗留表?如何将旧表映射到POJO
我见过类似的问题,比如legacy tables to jpa2 entities和generate object @entities from database,但它们都讨论了将表“反向工程”到对象的工具。难道不应该有一个手工操作的选项,一旦映射正确,就让ORM框架来管理它们吗?这一切似乎都像是在做我所要求的事情,但在我看来,将遗留数据库转换为ORM管理的数据库应该是规则
谢谢!
# 1 楼答案
从另一个角度来看:越来越多的web应用程序不再使用“直接SQL”。这扩大了web开发人员与SQL/RDBMS之间的“距离”。这造成了一个鸿沟
甚至还有相反方向的库:不再有HQL,只有普通SQL。 例如,有ANORM,这意味着“Anorm不是对象关系映射器”
给出的例子看起来很好,也很简单。但整个过程不仅仅是表定义和insert/update/delete。稍后,您必须查询数据,您可能希望使用数据库的所有功能(窗口聚合函数等)尽快查询数据,此时ORM可能很棘手
至于你的问题:我建议仔细检查当前的数据模型和查询。编写一些原型,看看访问数据的两种方式是否/如何共存(缓存问题、集成问题等)。如果不能完全切换到ORM映射器,那么使用“普通的旧SQL”可能会更容易,这没关系。重要的不是映射器:最终到达SQL服务器的是SQL命令
并确保您可以使用最新版本的JPA。其中一个早期版本甚至没有区分大小写的排序功能。一般来说,由于版本通常由您的数据中心定义(=您别无选择),请检查此版本是否支持您需要的所有功能
# 2 楼答案
是的,您可以对现有数据库使用ORM。我不知道现在JPA有多灵活(没有跟上所有规范的变化),但我知道Hibernate在将对象与现有表匹配(支持各种遗留配置)方面非常灵活。没有什么能阻止您同时使用ORM和直接JDBC(如果您通过两个通道管理更新,可能会出现一些同步问题)。事实上,在某些情况下,直接使用JDBC可能是有意义的(例如,临时报告)。同样,我不确定所有JPA都提供了什么,但我知道hibernate会话允许您访问底层JDBC连接,以便在需要时运行本机SQL