我正在尝试使用TypeORM为下一个逻辑对象模型实现数据持久化层:
这个想法是Provider
拥有AbstractResources
的集合,该集合描述了公共信息,并拥有对该Options
实例的可用AbstractResources
的引用。
resources
集合中存储的对象的确切数据类型继承自AbstractResource
:Scooter
和Bicycle
。
我尝试了official Entity Inheritance documentation
中介绍的两个选项“单表继承”方式也无法立即使用,因为当我将Provider及其AbstractResoruce集合作为信号请求持久化时,我在type discriminator列中看到AbstractEntitiy。我尝试在持久化之前将具有该名称的属性显式添加到具有正确值的子类,但是在持久化期间此值将被覆盖。
@Entity()
@TableInheritance({
column: { name: 'discriminator', type: 'varchar' }
})
export abstract class Resource{
“最有效”的方式是“单表继承”,但在Provider
内针对每种子实体类型都具有独立的集合。这样,持久性就可以正常工作,从AbstractResource
到Options
的引用也可以正常工作,discriminator
列可以正确填充。但是读取的数据会收到每个资源集合中所有类型的所有实体的副本(如果Provider有1个踏板车和1个自行车,我将读取2个踏板车和2个自行车,其中Biycle集合同时包含Bicycle和Scooter)。解决方法是在实体读取后进行后过滤,但这不是100%正确的方法。
@OneToMany(type => Bicycle, bicycles => bicycles.provider, {cascade: true, eager: true})
bicycles: Bicycle[];
@OneToMany(type => Scooter, scooters => scooters.provider, {cascade: true, eager: true})
scooters: Scooter[];
使用TypeORM框架实现此逻辑数据模式的正确方法是什么?
答案 0 :(得分:0)
当前有效的解决方案是用聚合代替所有不稳定性。
我重构了实体以避免任何继承和抽象类: Diagram sources
我介绍了具有最初所需的对象布局和层次结构的业务对象层
这是一个基于对象设计的笨拙解决方案,可使TypeORM正常工作。不幸的是,该解决方案引入了许多额外的代码和计算,因此可支持性受到影响。我想最初的问题可能有基于TypeORM的解决方案。