0

我有一个 Location 模型类。我有一个抽象类,Persister。我有两个抽象类的实现:MySQLPersister 和 MongoDBPersister。推理是为了让我可以在需要时在使用 MySQL 或 MongoDB 之间切换。请注意,我没有同时使用两者。只是为了更灵活。

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

例如,如果我想从使用 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.ModelModel

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

4

2 回答 2

0

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

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

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

于 2012-06-05T19:20:04.583 回答
0

I would try using another abstraction layer on top of your persistence layer. Your abstract layer should provide implementation-independent methods for your needs to your application and the layer should then delegate the calls to the actual, framework-dependent, persistence layer implementation (e.g. jpa.Model or Morphia.model).

This is not too much duplication, but a good use case for object oriented programming :)

于 2012-06-05T16:44:28.833 回答