Spring4d支持实体的继承吗?

问题描述 投票:0回答:2

我的数据库中有两个表代表继承关联,如下所示:

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 没有在任何地方使用,并且我尝试使其正常工作但没有成功。我是不是做错了什么?

delphi inheritance orm spring4d
2个回答
0
投票

看看TMS Aurelius。它完全支持此功能,并且是与 spring 4D 类似风格的 ORM,具有更多功能。虽然是商业的,但不是开源的,而且要花钱。


0
投票

继承确实没有意义,因为它们来自两个不同的表并且实现不同。名称来自连接,这是基于属性的系统的缺点之一,它不遵循继承树备份父级。

如果我们在心里为这两个对象构建 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;

到第二个对象并删除继承应该会给你你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.