我的数据库中有两个表代表继承关联,如下所示:
table person:
row_id name
1 Fred
2 Jack
table customer:
row_id credit_limit
1 1000.00
2 2000.00
我将这些表结构映射到以下类:
[Entity]
[Table('person')]
TPerson = class
private
[Column('row_id', [cpPrimaryKey, cpDontInsert, cpDontUpdate])]
FId: Integer;
[Column('name', [])]
FName: string;
public
property Id: Integer read FId;
property Name: string read FName write FName;
end;
[Entity]
[Table('customer')]
[Inheritence(isJoined)]
TCustomer = class(TPerson)
private
[Column('row_id', [cpPrimaryKey, cpDontInsert, cpDontUpdate])]
[JoinColumn('row_id', 'person', 'row_id')]
FId: Integer;
[Column('credit_limit')]
FCreditLimit: Currency;
public
property CreditLimit: Currency read FCreditLimit write CreditLimit;
end;
当我尝试使用下面的代码获取客户列表时,我收到一条错误消息,告诉我表客户没有“名称”列
function TRepository.GetCustomersByName(const pName: string): IList<TCustomer>;
var
vCrit: ICriteria<TCustomer>;
vProp: IProperty;
begin
vCrit := FSession.CreateCriteria<TCustomer>;
vProp := TProperty<TCustomer>.Create('name');
vCrit.Add(vProp.Like(pName, mmStart, False));
Result := vCrit.ToList;
end;
所以我想知道 Spring4d 是否支持实体的继承,并且我发现了一些属性表明它支持,例如 InheritanceStrategyAttribute 和 DiscriminatorAttribute。但是,我注意到 InheritanceAttribute isJoined 没有在任何地方使用,并且我尝试使其正常工作但没有成功。我是不是做错了什么?
看看TMS Aurelius。它完全支持此功能,并且是与 spring 4D 类似风格的 ORM,具有更多功能。虽然是商业的,但不是开源的,而且要花钱。
继承确实没有意义,因为它们来自两个不同的表并且实现不同。名称来自连接,这是基于属性的系统的缺点之一,它不遵循继承树备份父级。
如果我们在心里为这两个对象构建 sql,它看起来像下面这样,这表明第二个查询中 name 不存在:
select row_id, name from person
和
select row_id, credit_limit from customer
join person on person.row_id = customer.row_id
在这种情况下,我将重新实现 name 而不是从其他对象继承。 此外,如果您创建人员而不是客户,然后创建人员和客户(假设它们是 autoinc 字段),以这种方式使用 row_id 可能会导致数据问题。 我会向客户添加另一个整数字段,该字段是该人员的外键,这样您就可以拥有比客户更多的人员,否则为什么要有两个单独的表?
在您的示例中添加
[Column('person.name', [])]
FName: string;
到第二个对象并删除继承应该会给你你想要的。