【问题标题】:Inheritance in entities, using objectbox实体中的继承,使用对象框
【发布时间】:2018-01-09 21:14:22
【问题描述】:

在我的代码中,我将一些基本字段放在基本抽象类BaseEntity

public abstract class BaseEntity {

    @Id
    private long id;

    public BaseEntity() {
    }

    public BaseEntity(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

所以,在子类User 我没有定义id 字段:

@Entity
public class User extends BaseEntity {

    private String name;
    private String login;
    private String gender;

    private String email;
    private String phoneNumber;

    private Date registrationDate;
    private Date lastActivityDate;

    private long systemId;

    public User() {
    }

...Getters and Setters
}

因为它在超类中定义。我不想在每个类中创建一个id 字段,也不想在数据库BaseEntity 类中持久化。我得到一个错误: Error:[ObjectBox] Code generation failed: No ID property found for Entity User (package:...)

如何使用带有继承的对象框?

【问题讨论】:

    标签: java android inheritance objectbox


    【解决方案1】:

    目前不支持实体的多态,但是有一个feature request

    如果有帮助,您可以选择一个界面。例如:

    public interface BaseEntity {
        long getId();
    }
    

    注意:您可以为 ID 设置一个 setter,但我个人的建议是将 id 字段包私有(因此 ObjectBox 可以从生成的类访问)并且没有设置器,因为它表明可以更改随时识别。

    更新: ObjectBox 1.4 引入了entity inheritance(非多态)。

    【讨论】:

      【解决方案2】:

      @Oleg Objectbox 不支持实体类中的继承,因为它会将每个实体映射到 db 中的单独表,并使用此 @Id 变量作为唯一 id 来标识该表中的行(实体实例)。因此@Id 变量对于每个实体类都是必须的。

      一般来说,

      对于每个子类要访问父类变量,它必须是受保护的或公共的,但在您的 id 中是私有的,因此将其更改为受保护的它会起作用。

          protected long id;
      

      如果您将其标记为受保护,则只有父类及其子类可以访问它,并且当您将其标记为公共时,任何类都可以访问它。 将其标记为私有意味着只有父类可以访问它

      【讨论】:

      • 是的,你是对的。 Objectbox 将每个实体视为 db 中的一个表。因此它将每个实体转换为 db 中的一个表,为此它需要一个 id 列来标识该表中的每一行,因此它需要每个实体中的 @Id 变量。
      • 在使用 Objectbox 时,您必须首先设计您的数据库和必须具有的表,然后为每个表创建一个实体。这样你就不会有这样的困惑了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2011-05-19
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多