Mendix实体的生命周期以及传递 - mendixCN/widgets-resources-cn GitHub Wiki
什么是实体
实体通常代表一类现实世界的对象,例如客户、发票、CD 等。实体的实例称为对象。
实体种类
- 持久化实体 当实体被声明为可持久化时,将为该实体创建一个数据库表。这些类型的实体在域模型中用蓝色表示。有关持久实体的更多信息,请参阅持久性
- 非持久化实体 非持久实体存储在运行时内存中,永远不会提交到数据库。这些类型的实体在域模型中为橙色。
- 外部实体 通过数据中心窗格在您的应用程序中使用来自其他应用程序的数据源。这些数据源在域模型中表示为外部实体,在域模型中显示为紫色实体容器。有关更多信息,请参阅外部实体。
生命周期
简介
下面解释了持久化和非持久化对象的生命周期,以及它们如何流经平台内存。为了理解非持久对象的行为,您需要了解一些事实:
- 非持久对象是被认为是临时的并且只存在于内存中的对象
- 未提交的已更改持久对象仅存在于内存中,其行为与非持久对象相似
- Mendix 平台会在对象不再“使用”时自动删除它们(“使用”的定义将在后面解释)
行为
- Mendix 中的非持久对象不保存在运行时服务器中,而是保存在 Mendix 客户端中。这意味着没有服务器端垃圾收集。这简化了服务器端对象的处理,因为对象在服务器上存在时不会被垃圾收集。
- 对象将与对请求的响应一起返回给客户端。在请求上下文之外创建的对象(如调度事件执行)将在调度事件完成时自动丢弃。
XAS
XAS 请求
在上面你会看到一个典型的 xas 请求。让我们来看看每个字段:
- action:我们提到所有运行时操作都要通过一个 xas API,所以每个操作都必须是可区分的。此处该 action 字段用于此目的。当前操作是 instantiate,它要求运行时创建一个 Mendix 对象。
- params:每个 xas 动作可能有自己的参数集,因此 params 包含特定于动作的参数。对于 instantiate 调用,运行时需要知道要创建什么类型的对象,因此在 objecttype 字段中传递 。
- changes:这是与客户端状态相关的字段之一。每当发出 xas 请求时,Mendix 客户端都会随请求发送相关状态,并且 changes 是该状态的一部分。由于创建一个新对象不需要任何状态,这里它是空的。
- objects:这是与客户端状态相关的第二个字段。此处 Mendix 客户端根据运行时在请求期间可能需要的状态提供对象。由于创建新对象不需要任何对象状态,因此它也是空的。
XAS 响应
通过 在网络 请求详细信息视图中选择预览选项卡 来检查响应
在上面你会看到一个典型的 xas 反应。该 actionResult 字段与操作本身直接相关,但其他字段与客户端状态相关。
每次调用 之后 xas,运行时响应都会保留有关请求期间发生的事情的信息,例如创建或删除了哪些对象。运行时在给客户端的每个响应中传达它们,因此客户端将这些更改应用于其状态。
- commits 此字段包含在请求期间提交的 guid 列表。由于创建本身不会提交对象,因此它是空的。填充后看起来像这样:
"commits": ["guid_1", "guid_2", "...guid_n"]
Mendix 客户端使用此信息来了解何时提交了新对象。这样它就可以相应地更新客户端状态。
-
changes 此字段包含请求期间对 Mendix 对象所做的所有更改的摘要。这意味着这些更改尚未提交,因此应将它们存储在状态中。
-
resets 此字段包含每个 Mendix 对象的所有回滚属性更改的摘要。Mendix 客户端使用该信息从其状态中删除现有更改。
-
deletes 此字段包含在请求期间删除的 Mendix 对象的 guid 列表。Mendix 客户端使用该删除信息从状态中删除相应的对象及其更改。
-
newpersistable 此字段包含在请求期间创建的 guid 列表,因此 Mendix 客户端知道它们尚未提交,并且需要根据需要存储它们。在我们的 instantiate 调用中,它创建了一个新 Artist 对象,但没有提交。这就是为什么我们看到它的 guid 出现在这里的原因。
-
objects 此字段包含运行时操作需要作为响应的一部分发送到客户端的 Mendix 对象列表。在我们的示例中,运行时发送新 Artist 对象的 JSON 表示 。 典型的 Mendix 对象可能具有以下字段: objectType:定义对象的对象类型。 guid: 对象的唯一 ID。 hash:这可确保整个对象内容不被篡改。 attributes: 包含 对象的每个属性的 提交值。对于新对象,这些值等于属性的默认值。请注意,仅存在当前用户可访问的属性。
客户端垃圾收集
Mendix 客户端有一个垃圾收集器。此垃圾收集器将通过删除不再使用或需要保留在内存中的对象来自动释放内存。对象在小部件中可见时使用。对于非持久化对象,这也意味着当其他使用过的对象引用它们时,它们被视为在使用中。未更改的持久对象在不使用时会从内存中删除,因为它们可以在必要时从 Mendix 数据库重新加载。
特殊情况
与当前用户或会话关联的对象
当非持久化对象与当前用户或当前会话相关联时,它们(以及与它们关联的任何非持久化对象)不会被垃圾回收。因此,这可以作为对象保留请求的一种方式,尽管这应该谨慎使用,因为它很容易导致状态不断增长。
作为网页参数的对象
作为在 Web 浏览器中关闭的页面的参数的对象仅在打开五个新页面后才会被垃圾收集。这意味着最终用户可以在他们的浏览器中使用后退按钮(次数有限)并且仍然看到他们之前看到的相同页面,即使参数是不可持久的。
自定义组件开发所涉及的实体案例讲解
创建
后端创建
前端创建
mx.data.create({
entity: "MyFirstModule.Cat",
callback: function (obj) {
console.log("Object created on server");
},
error: function (e) {
console.error("Could not commit object:", e);
},
});
修改
提交
前端提交
mx.data.commit({
mxobj: obj,
callback: function () {
console.log("Object committed");
},
error: function (e) {
console.error("Could not commit object:", e);
},
});
回滚
删除
后端删除
前端删除
mx.data.remove({
guid: "123456",
callback: function () {
console.log("Object removed");
},
error: function (e) {
console.error("Could not remove object:", e);
},
});