我总是看到更多的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托管数据应该是我认为的规则。
谢谢
答案 0 :(得分:0)
是的,您可以将ORM用于现有数据库。我不知道JPA最近是多么灵活(没有保留所有的规范变化),但我知道Hibernate在将对象与现有表匹配时非常非常灵活。支持各种遗留配置)。没有什么可以阻止你并排使用ORM和直接JDBC(如果你通过两个渠道管理更新,可能会出现一些同步问题)。实际上,对于某些情况,直接JDBC可能有意义(例如,临时报告)。再一次,我不确定JPA提供了什么,但我知道一个hibernate Session允许你访问底层的JDBC连接,这样你就可以在需要的时候运行本机SQL。
答案 1 :(得分:0)
术语非ORM数据库不正确,数据库可能是关系型(RDBMS),面向对象,面向文档等... ORM表示对象关系映射,它只是指一种旨在缓解的框架使用面向对象语言的RDBMS。
您可以完美地使用JPA和本机sql来查询数据库,甚至可以使用JPA工具轻松地从数据库模式生成所有数据库实体。
BUT
你必须小心注意这些事实:
,您将无法利用事务上下文传播(您将使用自己的sql连接进行本机SQL查询)
答案 2 :(得分:0)
从不同的角度看待它:越来越多的Web应用程序不再使用“直接SQL”了。这扩大了Web开发人员和SQL / RDBMS之间的“距离”。它会造成差距。
甚至有相反的库:没有更多的HQL,只有普通的SQL。 例如,有ANORM,这意味着“Anorm不是对象关系映射器”。
给出的示例看起来很简单。但整个故事不仅仅是表定义和插入/更新/删除。稍后您必须查询您的数据,并且您可能希望使用数据库的所有功能(窗口聚合函数等)尽快查询,并在此处点ORM可能很棘手。
至于你的问题:我建议仔细检查当前的数据模型和查询。编写一些原型来查看两种访问数据的方式是否/如何共存(缓存问题,集成问题等)。如果你不能完全切换到ORM映射器,那么坚持使用“普通旧SQL”可能会更容易,这没关系。重要的不是映射器:在一天结束时,它是到达SQL服务器的 SQL命令。
并确保您可以使用最新版本的JPA。其中一个早期版本甚至没有不区分大小写的排序。一般来说,由于版本通常由您的数据中心定义(=您别无选择),请检查此版本是否支持您需要的所有功能。