Java 在Morphia/MongoDB中存储有序实体
我正在学习Morphia/MongoDB,我有一个关于有序实体的问题。我没有太多的运气去寻找关于这个主题的现有问题 对于这个问题,我有三个实体:Java 在Morphia/MongoDB中存储有序实体,java,mongodb,morphia,Java,Mongodb,Morphia,我正在学习Morphia/MongoDB,我有一个关于有序实体的问题。我没有太多的运气去寻找关于这个主题的现有问题 对于这个问题,我有三个实体:Job、JobStatus和JobPriority JobStatus和JobPriority实例由用户动态定义。这些实体是各个作业实体将引用的全局值。JobStatus和JobPriority都需要可排序,并且需要保存该顺序 出于本能,我开始采用以下设置(为了便于阅读而精简): 第一:有序实体 @Embedded abstract class Orde
Job
、JobStatus
和JobPriority
JobStatus和JobPriority实例由用户动态定义。这些实体是各个作业实体将引用的全局值。JobStatus和JobPriority都需要可排序,并且需要保存该顺序
出于本能,我开始采用以下设置(为了便于阅读而精简):
第一:有序实体
@Embedded
abstract class OrderedEntity {
@Indexed(value=IndexDirection.ASC, name="order_ndx", unique=true)
Integer oderNdx;
}
@Embedded
class JobStatus extends OrderedEntity { ... }
@Embedded
class JobPriority extends OrderedEntity { ... }
第二:管理排序顺序的父实体
@Entity
abstract class OrderedEntityList<T extends OrderedEntity> {
@Embedded
List<T> entities;
}
@Entity
class JobStatusList extends OrderedEntityList<JobStatus> { ... }
@Entity
class JobPriorityList extends OrderedEntityList<JobPriority> { ... }
我的计划是在启动时创建JobStatusList和JobPriorityList的实例,然后在UI中使用一个表单,允许用户插入嵌入的状态/优先级实例并定义顺序
我确信这样做是错误的,我想在深入研究之前获得一些意见
如果我正确理解Morphia注释,作业实体就不能@Reference
JobStatus
或JobPriority
值,因为@Embedded
实体不能有可引用的ID
编辑: 根据评论和回答,这个问题需要澄清 我正在创建一个通用的作业跟踪框架,可以在运行时进行调整,以适应各种业务模型
JobStatus
表示每个作业的用户定义状态。最终,我希望能够查询所有“已完成”的作业,因此我希望维护一个JobStatus
条目的全局列表,用户可以根据需要生成和排序这些条目
在任何给定时间,作业
仅引用单个作业状态
,但在更新作业
的状态时,我希望能够从可预测的用户定义值列表中选择工作流顺序中的下一个状态
JobPriority
的相似之处在于,我希望它是一个有序的、用户定义的值的全局列表,但在大多数情况下,作业只会引用单个优先级
同样,我希望能够查询像所有“加急”工作这样的事情
我知道,只要保存单个实体并在移动现有列表条目时更新所有JobStatus和/或JobPriority上的
orderNdx
字段,就可以在没有列表的情况下实现这一点,但是我希望能够以一种方式来保证在orderNdx
中有一个唯一的值,Morphia允许您在列表中定义嵌入式类以保持事物的有序性。因此,您有一个非常简单的解决方案,应该适合您:
@Embedded
class JobStatus {
...
}
@Embedded
class JobPriority {
...
}
@Entity
class Job {
@Embedded
List<JobStatus> statuses = new ArrayList<JobStatus>();
@Embedded
List<JobPriority> priorities = new ArrayList<JobPriority>();
...
}
@Embedded
班级工作状态{
...
}
@嵌入
班级工作优先权{
...
}
@实体
班级作业{
@嵌入
列表状态=新建ArrayList();
@嵌入
列表优先级=新建ArrayList();
...
}
这样可以跳过Mongo中不必要的收集,并将嵌入的内容与作业一起保存,从而避免多次往返数据库,减少延迟。因此每个作业都有许多状态和优先级,但每个作业状态只引用一个作业?更准确地说,有许多作业状态和作业优先级值,而每一份工作都只引用一份。就JobStatus而言,它就像一个渐进步骤。例如,作业在工作流程中会引用Ordered->Printed->Delivered。您可以在Mongo中添加唯一的索引,以确保字段的唯一组合,如SQL db。您还可以索引和查询嵌入式字段,如
{status:{label:'Blah',idx:3}}
,但是,如果我理解注释,在作业中嵌入JobStatus/JobPriority值可防止在全局级别定义它们?我想我可以将全局列表的副本传递到作业中,并向作业内的实例添加布尔值isSelected
,但这似乎效率低下,如果在全局级别进行更改,则嵌入的副本不会更新。
@Embedded
class JobStatus {
...
}
@Embedded
class JobPriority {
...
}
@Entity
class Job {
@Embedded
List<JobStatus> statuses = new ArrayList<JobStatus>();
@Embedded
List<JobPriority> priorities = new ArrayList<JobPriority>();
...
}