2

我是 API 新手。在我看来,您必须像这样通过“上下文”对象构造对象:

ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-project.xml");
context = cayenneRuntime.newContext() 
...
MyEntity entity=context.newObject(MyEntity.class);

而不是仅仅以通常的 new() 方式创建 Java 对象:

MyEntity entity=new MyEntity();

但我想为我的“MyEntity”类创建一个构造函数,它可以执行以下操作:

public MyEntity(String inputFile) {
...
do setters based on information derived from inputFile (size, time created etc).
...

我怎样才能做到这一点 - 理想情况下,我想将逻辑保留在 MyEntity 类本身上,而不是在其他地方有一个“包装器”类来实例化对象并执行设置......我想我可以有一个“助手”方法,它只是先前实例化实例上的设置...但是我在这里缺少一个成语...?

4

1 回答 1

2

你通过'context.newObject(..)'创建对象是正确的——这是最好的方法,可以让你远离麻烦。您实际上仍然可以拥有自己的构造函数(前提是您还维护了一个供框架使用的默认构造函数):

public MyEntity(String inputFile) {
   ...
}

public MyEntity() {
}

然后您可以先创建对象,然后将其添加到上下文中:

MyEntity e = new MyEntity(inputFile);
context.registerNewObject(e);

就惯用语而言,一个非常常见的做法是避免持久对象中的业务逻辑。ORM 模型通常在多个应用程序中重用,并且您添加到实体的行为并不统一适用于所有地方。这个论点的另一面是,除了最简单的方法之外,任何东西都依赖于对周围环境的了解——这是你不希望你的实体知道的。

相反,人们会编写一个位于实体之上并包含所有业务逻辑的自定义服务层(通常与依赖注入容器一起使用)。服务不是实体的包装器(实际上服务通常是单例的)。您可以将它们视为可配置的策略对象。在 Java 世界中,这种分层设计和这种类型的关注点分离非常普遍,并且可能是最灵活的方法。

但是如果你想快速破解一些东西,并且不希望它发展成一个复杂的多模块系统,那么在实体中使用自定义构造函数或静态工厂方法当然就可以了。

于 2013-09-02T18:03:08.273 回答