什么是领域模型?
要在西门子Mendix中存储数据,您需要使用领域模型,即西门子Mendix中包含的对象关系映射(或 ORM)。您可以将其与 Hibernate、Entity Framework 或 Django 进行比较。让我们熟悉一下西门子Mendix结构化数据的方式!
领域模型支持多种数据库。您可以选择适合小型应用程序的内部数据库,也可以选择西门子Mendix支持的企业数据库之一。这些包括:
- IBM DB2.
- Microsoft SQL Server.
- MySQL/MariaDB.
- Oracle Database.
- PostgreSQL. 您可以从项目设置中配置应用程序使用的数据库。通过编辑默认配置, 可以在App → Settings下的App Explorer中找到它们。
配置完成后,西门子Mendix将负责数据库和您的应用程序之间的所有通信。这包括为您的应用程序创建和迁移数据库架构并保留您的数据。为了实现这一点,西门子Mendix为您的数据库模式提供了一个单独的版本控制系统。
西门子Mendix的领域模型
西门子Mendix将数据存储在实体中。这些代表现实世界的元素,如客户、发票、订单等。实体通常包含属性,这些属性是描述和识别实体的特征。例如,客户实体具有姓名、电子邮件地址和其他个人详细信息的属性。发票实体有一个 ID 号、一个送货地址和一个帐单地址。实体也可以与其他实体有关系,称为关联。这种关系的一个例子是属于客户的订单或与订单相关的发票。
西门子Mendix实现支持类型发现的反射,因此您创建的每个实体都可以使用 IMendixObject 基类进行询问。除其他外,此类具有 getType() 和 getMembers() 函数。您可以使用这些函数分别检索实体的类型和成员(属性和关联关系)。
每个成员都继承自 IMendixObjectMember 类,该类也有一个 getType() 函数。这允许您确定成员是原始类型还是引用类型(属性或关联)。如果它是原语,则它是 IMendixPrimitive 类型,您可以使用getType() 和 getValue() 函数来确定它是什么类型以及这个特定对象的值是什么。
如您所见,所有这些元素都允许您通过西门子Mendix中的 Java API 完全访问应用程序中的数据。这是 Mendix 在运行时用来解释模型的 API,因此您编写的任何 Java 代码都可以融入到西门子Mendix中。
一个实体有几个可以配置的选项,通常从命名它开始。实体也可以具有用于继承的泛化。在西门子Mendix中,我们使用类表继承来实现继承。每个实体都会在数据库中获得自己的表。子表链接到它们的父表,因为它们都共享相同的唯一 ID。从子类中检索数据后,系统将遍历层次结构到父表以从父类中检索属性,并执行 JOIN 以获取实体的完整属性列表。
如何将数据进行持久化?
现在您已经掌握了所有理论,您可以确保数据可以存储在您的西门子Mendix应用程序中。您可以通过从App Explorer打开 Domain Model窗口来做到这一点。
如您所见,领域模型。这些是西门子Mendix为导入映射创建的。橙色表示这些是非持久实体。要将它们存储在数据库中,您需要使它们持久化。实体将变为蓝色,因此您可以轻松地将它们与橙色的非持久实体区分开来。
- 双击 Department 实体并将其设置为Persistable。
2. 对Employee实体执行相同的操作。
2. 当您在Employee中时,单击New以添加名为HasAccount的 Boolean类型的属性。 您稍后将使用它来确定是否允许员工登录系统
实体和属性
您可以对实体执行更多操作,以任何您需要的方式存储数据。您可以在实体属性中选择另一个实体进行概括。如前所述,这允许您从实体继承成员和设置。您还可以将一些系统成员添加到您的实体中,这将自动保存某些系统信息。西门子Mendix提供createdDate、changedDate、 changedBy和owner作为系统成员。
领域模型中的实体将其数据存储在属性中。这些属性支持以下数据类型:
- Autonumber
- Binary
- Boolean
- Date and Time
- Decimal
- Enumeration
- Hashed string
- Integer
- Long
- String 为了澄清您刚刚操作的黄色和蓝色实体,请知道持久实体(蓝色)存储在数据库中,而非持久实体(黄色)仅在客户端会话期间存储数据。
领域模型支持的关系有哪些?
我们再多讲实体之间的关联类型。西门子Mendix支持常见的疑点:一对一、一对多和多对多关系。
所有关联都是使用链接表实现的。这允许在不同类型之间轻松切换。此外,它在过滤多个关联时节省了大量时间,因为不是联接数据表,而是仅联接较小的链接表。
由于链接表的信息非常少,因此您经常会看到西门子Mendix开发人员在需要保存有关多对多关系的附加信息时在中间使用“信息实体”。
领域模型,但可以编辑。自动生成的名称遵循最佳实践,应默认使用,除非您需要在相同实体之间建立多个关联。在这种情况下,我们建议将关联名称扩展为更具描述性。以可识别的目的扩展此名称可以阐明您应该如何使用该关联。例如,您可以在Department和Employee之间建立关系. 一个人可能在一个部门工作,但您还希望允许经理在其部门内编辑权限,而无需创建单独的经理实体。解决此问题的一种方法是为此目的创建两个关联并相应地调整关联的名称。例如,Department_Employee_Security。
当实体之间已经存在关联并且您更改其中一个或两个实体的名称时,西门子Mendix将自动重命名关联。
给我们的实体起个名字
还记得我们之前谈到的命名约定吗?我们也有一些用于 领域模型 。
- 大多数情况下,实体反映了人们可以与之相关的现实世界对象或想法。因此,实体名称还应反映该对象并确定其用途。实体的名称是单数的,因为当我们创建该实体的实例时,它们将是单数的。例如,使用Customer而不是Customers。此外,我们建议避免在实体名称中使用缩写、下划线、数学字符或任何其他特殊字符。实体名称也应该使用 Pascal Case,例如HousekeepingRecord或LogEntry。
- 属性应该反映它们所描述的实体的可理解属性。我们建议尽可能避免名称中的缩写或特殊字符,但有一个例外。不反映业务相关数据但仅出于技术原因需要的属性应以下划线 (_) 开头。命名约定再次使用 Pascal Case,例如FirstName或TelephoneNumber。
您可以在此处找到有关实体命名约定的文档: https ://docs.mendix.com/howto/general/dev-best-practices#3-2-domain-model
开始我们的创建实体
现在您已经大致了解了命名约定,是时候手动创建一些实体,以便您可以存储有关医院各个部门、属于他们的员工以及需要填补的班次的信息。
- 从领域模型窗口的顶部,单击 实体 并将其拖放到工作区中。
- 双击新创建的实体以打开其属性,并将其命名为 S shift。
- 通过单击新建来添加属性 。将其 命名为ShiftId 并将类型设置为 AutoNumber。
- 单击 确定。
- 按照相同的步骤添加属性 Start Time 和 End Time ,两者都具有 Date 和 time 类型。 确保将 两个日期时间属性的Localize设置 为 No。
- 通过单击 Shift 的边框并将线拖动到 Department创建从 Shift 到 Department 的 1-* 关联。********
- 创建一个从 Shift 到 Employee的 1-* 关联。
使用您创建的这个新实体和关联,可以将来自不同部门的员工分配到轮班。
西门子Mendix的对象是什么?
当您实际向西门子Mendix应用程序添加数据时,会创建一个对象。对象是基于实体的单一实例。输入此应用程序的员工数据将占用一个对象。因为西门子Mendix有一个无状态运行时,所以这个对象要么存在于数据库中,如果是持久的、已提交的对象,或者存在于客户端上,如果是非持久对象、尚未提交的持久对象,或持久对象客户端正在使用。运行时仅在执行操作时将这些对象保存在内存中。
将员工(Employee)实体关联到账户(Account)实体
现在我们已经配置了员工实体,我们应该将 Employee 实体链接到默认安装在所有西门子Mendix应用程序中的特殊实体 Account 实体。这将使我们能够根据具体情况轻松地为需要访问仪表板的员工创建帐户。我们可以通过创建如图所示的一对一关系来做到这一点。
- 从App Explorer打开 领域模型。****
- 双击 Employee 实体。
- 单击 关联 选项卡。
- 单击 新建 以创建新 关联。
- 通过展开Marketplace 模块然后选择Administration来选择Account实体。********
- 将 Owner设置 为 新创建的关联的Both ,使关联成为 1-1 关联。
- 完成后,单击 OK。
由于您已将关联添加到管理模块,因此该模块的实体访问权限现在已过期。您应该能够在“错误” 选项卡中看到该错误。
-
双击错误选项卡中的错误以打开管理模块领域模型。
-
单击更新安全性以修复错误。
由于我们知道来自MockHrService的信息永远不会超过 200 个字符,因此我们可以调整实体Employee和Department的属性大小。回到UserManager中的领域模型来执行此操作。
-
通过双击打开Employee实体。
-
单击 Title 属性并将长度从 Unlimited更改 为 Limited。
-
对String类型的所有属性重复此 操作。****
-
对 部门 实体重复此操作。
现在您已经设置了所有实体并将属性设置为正确的大小,是时候将注意力转向属性屏幕中的其他选项卡了。
其他实体元素还有什么?
您可以配置实体的几个其他功能。这些功能中的每一个在实体中都有自己的部分。
系统成员属性
系统成员可以通过单击复选框来激活。它们将被添加到您的实体中,并且可以在可以访问其他属性的任何地方使用。
验证规则
您可以向属性添加验证规则。一个属性可以有多个验证规则。规则可以确保属性是required, unique, equals某物、在一定range、匹配某个n regular expression或具有maximum value。 重要的是要记住验证规则不能应用于associations。
事件监听处理接口
您可以使用事件处理程序在以下对象事件之前或之后触发逻辑:
- Create
- Commit
- Delete
- Rollback
索引
此选项卡允许您为列设置索引,从而可以更有效地搜索它们。
访问规则
为确保您的数据安全,您可以配置访问规则。这使您可以确保只有正确的用户才能访问敏感数据。此功能仅在您的 App Security 级别 设置为 Production时可用。