我有一个Location模型类。 我有一个抽象类,Persister。 我有两个抽象类的实现:MySQLPersister和MongoDBPersister。 推理是这样的,我可以随时在使用MySQL或MongoDB之间切换。请注意,我不是同时使用两者。只是为了更灵活。
问题是Location模型类扩展 Model ,MySQL必须导入play.db.jpa.Model。 MongoDB将导入play.modules.morphia.Model。这成为一个问题,因为每次我想切换时,不仅要更改Location模型类,我还必须更改Persister实现中的代码,因为这两个库具有不同的模型方法。 / p>
例如,如果我想从使用JPA更改为Morphia,我必须注释掉MySQLPersister中的代码。 Model.find()。fetch()在JPA中返回Iterable,当我导入JPA时,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.Model
和play.modules.morphia.Model
都来自更广义的Model
类,那会更好。这样,如果我想实现两个数据库,我就不必去改变模型。
谢谢!如果我的解释不清楚,请告诉我。
答案 0 :(得分:0)
我会尝试在持久层之上使用另一个抽象层。您的抽象层应该为您的应用程序提供与实现无关的方法,然后该层应该将调用委托给实际的,依赖于框架的持久层实现(例如jpa.Model或Morphia.model)。
这不是太多重复,而是面向对象编程的一个很好的用例:)
答案 1 :(得分:0)
我决定采用以下解决方案:
在MySQLPersister和MongoDBPersister中创建内部Location类,并使用它们来执行ORM并查询数据库。然后将内部Location类键入的结果转换为一般的前端,LocationBean。基本上,我在两个Persisters中的内部类中重复了两次Location模型。
这样,如果我想在数据库之间切换,我只需要在初始化一个新的MySQLPersisteR()或一个新的MongoDBPersister之间进行更改。如果我需要实现一个新的数据库,我只需要再次扩展LocationPersister,使用自己的ORM内部类。