1

在我的代码中,我将一些基本字段放在基本抽象类中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:...)

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

4

2 回答 2

2

目前不支持实体的多态性,但是有一个特性请求

如果它有帮助,你可以去一个接口。例如:

public interface BaseEntity {
    long getId();
}

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

更新: ObjectBox 1.4 引入了实体继承(非多态)。

于 2017-09-16T21:05:38.490 回答
0

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

一般来说,

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

    protected long id;

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

于 2017-09-16T18:21:47.840 回答