我可以将 Cayenne 配置为使用提供程序来获取模型的新实例吗?

Posted

技术标签:

【中文标题】我可以将 Cayenne 配置为使用提供程序来获取模型的新实例吗?【英文标题】:Can I configure Cayenne to use a provider to get a new instance of a model? 【发布时间】:2019-10-28 14:25:40 【问题描述】:

我想通过 Guice 向新的 Cayenne 数据对象提供构造函数参数,但看起来 cayenne 只是使用 Class.newInstance() 来实例化新实例。有什么方法可以让 Cayenne 使用提供程序来获取新实例?例如,在获取期间实例化新实例时,我需要它来执行此操作,而不仅仅是在我创建新实例时。

稍微扩展一下,我有一个 Maven 项目,其中包含所有 Cayenne 模型和核心业务逻辑。然后我有另一个带有 API 实现的 Maven 项目。我希望能够在 API 项目中配置参数并让模型在运行时使用这些参数。

因此,可以使用构造函数注入或提供方法来实现 - 任何一种都可以。

有什么办法吗?

public class Foo extends _Foo  //_Foo extends CayenneDataObject

    private final String hey; 

    public Job(@Inject @Named("foo-job") String hey) 
        super();
        this.hey = hey;
    

【问题讨论】:

【参考方案1】:

Cayenne 持久对象不通过依赖注入 (DI) 进行管理。 DI 适用于数量相对较少的服务,而不适用于潜在的大量持久对象。

通过 Cayenne callbacks and listeners 将某些值传递给对象的更惯用方式。回调可以在 Modeler 中进行映射,并且不能对对象之外的应用有任何引用。因此,对于您的案例,听众可以成为一个解决方案。它们可以在 Guice 中进行 DI 管理和映射。

【讨论】:

如果您可以为课程提供供应商并按类别查找这些供应商,那就太棒了。实际上,我可能会在 Cayenne 中消除这一点。我们可以默认使用 class.newInstance() 作为实现,但实际上在 Cayenne 数据对象水合期间使用供应商ForClass(class).get()。生命周期事件对挂钩很有用,但您不能设置最终属性,这有助于使对象无状态。能够通过 Guice 参数化对象实例化的副作用是很酷的。谢谢你,Andrus,提醒您

以上是关于我可以将 Cayenne 配置为使用提供程序来获取模型的新实例吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Cayenne 将数据从非 Cayenne 应用程序插入数据库

Apache Cayenne“类未与 Cayenne 映射”

如何以编程方式将颜色设置为 Cayenne

Cayenne - 搜索依赖组合

是否可以使用我的服务器作为代理来获取 jwt 刷新令牌?

是否可以在 Bean 级别控制 cayenne 日志记录 - 以停止记录密码