繁体   English   中英

如果使用相同的模型,则使用JPA和Morphia的Play框架会发生冲突

[英]Play framework, using JPA and Morphia , conflicts if applying to same model

我有一个位置模型课。 我有一个抽象类,Persister。 我有两个抽象类的实现:MySQLPersister和MongoDBPersister。 这样做是为了使我可以在需要时在使用MySQL或MongoDB之间进行切换。 请注意,我不会同时使用两者。 只是为了更大的灵活性。

问题是Location模型类扩展了Model ,MySQL将不得不导入play.db.jpa.Model。 MongoDB将导入play.modules.morphia.Model。 这成为一个问题,因为每次我要切换时,不仅必须更改Location模型类,而且还必须更改Persister实现中的代码,因为这两个库的模型方法不同。

例如,如果我想从使用JPA更改为Morphia,则必须注释掉MySQLPersister中的代码。 当我导入JPA时,Model.find()。fetch()在JPA中返回Iterable,而Morphia中的Model.find()。filter()。asList()甚至都不存在。

我该如何克服这个问题? 我不想创建一个泛型模型类和另外两个导入每个数据库的相同模型类-这太多了。

基本上,我发现play-morphia和play-jpa的设计不灵活:

JPA                             PlayMorphia
play.db.jpa.Model           >   play.modules.morphia.Model
javax.persistence.Entity    >   com.google.code.morphia.annotations.Entity

如果将play.db.jpa.Modelplay.modules.morphia.Model都从更通用的Model类进行扩展,那会更好。 这样,如果我想同时实现两个数据库,则无需更改模型。

谢谢! 如果我的解释不清楚,请告诉我。

我会尝试在您的持久层之上使用另一个抽象层。 您的抽象层应为您的应用程序提供与实现无关的方法,然后该层应将调用委派给实际的,与框架相关的持久层实现(例如jpa.Model或Morphia.model)。

这不是太多的重复,而是面向对象编程的一个好用例:)

我决定采用以下解决方案:

在MySQLPersister和MongoDBPersister中创建内部Location类,并使用它们执行ORM和查询数据库。 然后将内部Location类键入的结果转换为面向前端的常规LocationBean。 本质上,我在两个Persister的内部类中两次复制了Location模型。

这样,如果我想在数据库之间进行切换,则只需在初始化新的MySQLPersisteR()或新的MongoDBPersister之间进行更改。 如果我需要实现一个新的数据库,我只需要再次使用它自己的ORM内部类来扩展LocationPersister。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM