2017-09-16 106 views
1

在我的代码我把一些基础领域中的抽象基类BaseEntity继承的实体,使用objectbox

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:...)

我如何使用继承的objectbox?

回答

2

此时不支持实体的多态性,但有一个feature request

如果有帮助,你可以去一个界面。例如:

public interface BaseEntity { 
    long getId(); 
} 

注意:你可以为ID的二传手,但我个人的建议是有id字段包私有(所以ObjectBox访问从生成的类),并没有一个二传手,因为它会建议可以随时更改ID。

更新:对象框1.4引入entity inheritance(非多态)。

0

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

一般来说,

每个儿童类访问父类变量必须对其进行保护或者不公开,但在你的id是私人所以将其更改为保护它会工作。

protected long id; 
如果你将其标记是只保护父及其子类可以访问它,当你把它标记为公开任何类都可以访问它

。 将其标记为只有父级可以访问的私有方式

+0

没有工作。它似乎像objectbox只允许POJO ... –

+0

是的,你是对的。 Objectbox将每个实体视为db中的一个表。因此它会将每个实体转换为db中的一个表,并且要做到这一点,它需要一个id列来标识该表中的每一行,因此它需要每个实体都有@Id变量。 –

+0

使用Objectbox时,必须首先设计DataBase和它必须具有的表,然后为每个表创建一个实体。这样你就不会有这样的困惑。 –