有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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 entitiesgenerate object @entities from database,但它们都讨论了将表“反向工程”到对象的工具。难道不应该有一个手工操作的选项,一旦映射正确,就让ORM框架来管理它们吗?这一切似乎都像是在做我所要求的事情,但在我看来,将遗留数据库转换为ORM管理的数据库应该是规则

谢谢!


共 (2) 个答案

  1. # 1 楼答案

    从另一个角度来看:越来越多的web应用程序不再使用“直接SQL”。这扩大了web开发人员与SQL/RDBMS之间的“距离”。这造成了一个鸿沟

    甚至还有相反方向的库:不再有HQL,只有普通SQL。 例如,有ANORM,这意味着“Anorm不是对象关系映射器”

    给出的例子看起来很好,也很简单。但整个过程不仅仅是表定义和insert/update/delete。稍后,您必须查询数据,您可能希望使用数据库的所有功能(窗口聚合函数等)尽快查询数据,此时ORM可能很棘手

    至于你的问题:我建议仔细检查当前的数据模型和查询。编写一些原型,看看访问数据的两种方式是否/如何共存(缓存问题、集成问题等)。如果不能完全切换到ORM映射器,那么使用“普通的旧SQL”可能会更容易,这没关系。重要的不是映射器:最终到达SQL服务器的是SQL命令

    并确保您可以使用最新版本的JPA。其中一个早期版本甚至没有区分大小写的排序功能。一般来说,由于版本通常由您的数据中心定义(=您别无选择),请检查此版本是否支持您需要的所有功能

  2. # 2 楼答案

    是的,您可以对现有数据库使用ORM。我不知道现在JPA有多灵活(没有跟上所有规范的变化),但我知道Hibernate在将对象与现有表匹配(支持各种遗留配置)方面非常灵活。没有什么能阻止您同时使用ORM和直接JDBC(如果您通过两个通道管理更新,可能会出现一些同步问题)。事实上,在某些情况下,直接使用JDBC可能是有意义的(例如,临时报告)。同样,我不确定所有JPA都提供了什么,但我知道hibernate会话允许您访问底层JDBC连接,以便在需要时运行本机SQL