gpt4 book ai didi

java - Spring + Mongo + 泛型 + 灵活性

转载 作者:行者123 更新时间:2023-11-30 04:44:53 26 4
gpt4 key购买 nike

以下代码不起作用(当然),因为标记的行无法编译:

MyClass {
//singleton stuff
private static MyClass instance;
private MyClass () {}
public static MyClass getInstance() {
if(instance==null) {
instance = new MyClass ();
}
return instance;
}

// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
if(someCondition)
return new GenericClass<classes[0],classes[1]>; // DOES NOT COMPILE
else
return new OtherGenericClass<classes[0]>;
}
}

因此,我其实不知道“create”是否会返回

GenericClass<classes[0],classes[1]>

OtherGenericClass<classes[0]>

具有不同数量的参数。

发生这种情况是因为我正在使用Spring并且我计划使用MongoDB,但将来我可能需要切换到不同的东西(例如Hibernate)。

类 GenericClass 类似于:

 GenericClass<PersistetType1, Long> 

 GenericClass<PersistentType2, Long>

其中 PersistentType1/2 是我最终需要存储在数据库中的类,而 GenericClass 是一种访问 Mongo API 的代理。事实上,它看起来像:

  public MongoTemplate getTemplate();
public void save(T toInsert);
public List<T> select(Query selectionQuery);
public T selectById(ID id);
public WriteResult update(Query selectionQuery, Update updatedAttributes);
public void delete(T toRemove);
public void delete(Query selectionQuery);

现在,什么?从 Controller (或实体,如果你很挑剔)我需要实例化存储库并调用任何方法。这导致 Controller 与 MongoDB 耦合,即它们必须显式实例化这样的 GenericClass,它实际上称为 MongoRepository,并且严格依赖于 Mongo(实际上它是一个具有恰好两个“自由度”的泛型)。

因此,我决定创建 MyClass,这是隔离 Controller 的进一步代理。通过这种方式,Controller 可以获得 MyClass 的单个实例,并让它创建适当存储库的新实例。特别是,当“somecondition”为 true 时,意味着我们想要使用 MongoRepository(当为 false 时,可能需要实例化一个 Hibernate 代理,即 HibernateRepository)。然而,MongoRepository 是通用的,因此它需要某种形式的实例化,我希望将其作为参数传递。

不幸的是,泛型是在编译时解析的,因此我猜它们对我不起作用。

我该如何解决这个问题?

最佳答案

为了将底层持久性存储与应用程序逻辑分离,我将使用 DAO 方法。

使用所需的方法定义 DAO 的接口(interface),例如然后为您可能需要的每个持久性提供程序提供一个实现,例如 UserAccess 可能是您可以实现为 HibernateUserAccess 和 MongoUserAccess 的接口(interface)。在每个实现中,您注入(inject)适当的模板,例如Mongo或Hibernate并使用它来完成持久化操作。

您可能遇到的问题是您的加载操作将返回 User 实例,这需要根据持久性提供程序而有所不同,即 JPA 注释将与 MongoDB 所需的 Spring Data 注释不同(泄漏抽象)。

我可能会通过创建一个用户界面来表示持久性操作的结果并为每个持久性提供程序提供一个实现来解决这个问题。或者返回一个您根据 JPA 或 Mongo 加载结果构建的通用模型。

关于java - Spring + Mongo + 泛型 + 灵活性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com