JPA与遗留本机SQL共存

时间:2013-05-24 18:18:03

标签: java jpa orm

我总是看到更多的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托管数据应该是我认为的规则。

谢谢

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

术语非ORM数据库不正确,数据库可能是关系型(RDBMS),面向对象,面向文档等... ORM表示对象关系映射,它只是指一种旨在缓解的框架使用面向对象语言的RDBMS。

您可以完美地使用JPA和本机sql来查询数据库,甚至可以使用JPA工具轻松地从数据库模式生成所有数据库实体。

BUT

你必须小心注意这些事实:

  • ORM将作为java实体管理数据库的内存中投影状态,管理实体的集合由对象'EntityManager'(或休眠中的Session)管理。 此对象不会知道使用本机sql进行的操作,既不是程序中的操作也不是数据库中的操作(最终触发器或存储过程)。您的实体的状态可能与数据库不一致。您可以手动刷新实体状态,但您必须关心它。

  • 您应该使用JPA api执行本机查询,以利用底层数据源连接池。如果你真的需要它,你可以使用本机JDBC语句(我真的不明白为什么),但是你也应该对同一个数据源执行它。在这种情况下,如果使用容器管理的entityManager

    ,您将无法利用事务上下文传播(您将使用自己的sql连接进行本机SQL查询)
  • 答案 2 :(得分:0)

    从不同的角度看待它:越来越多的Web应用程序不再使用“直接SQL”了。这扩大了Web开发人员和SQL / RDBMS之间的“距离”。它会造成差距。

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

    给出的示例看起来很简单。但整个故事不仅仅是表定义和插入/更新/删除。稍后您必须查询您的数据,并且您可能希望使用数据库的所有功能(窗口聚合函数等)尽快查询,并在此处点ORM可能很棘手。

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

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