Java 使用外部集合字段创建表

Java 使用外部集合字段创建表,java,ormlite,foreign-collection,Java,Ormlite,Foreign Collection,我有一个抽象类: 域项 abstract public class DomainItem { @DatabaseField(generatedId = true) protected long id; @ForeignCollectionField(eager = false) protected ForeignCollection<ContentItem> contentItens; //getters and setters

我有一个抽象类:

域项

abstract public class DomainItem {

    @DatabaseField(generatedId = true)
    protected long id;

    @ForeignCollectionField(eager = false)
        protected ForeignCollection<ContentItem> contentItens;

    //getters and setters
}
这些(无摘要):

植翅目含量

@DatabaseTable(tableName = "phytoterapiccontent")
public class PhytoterapicContent extends ContentItem {

    @DatabaseField(canBeNull = false)
    private String defaultName;

    @DatabaseField(canBeNull = false)
    private String scientificName;

    //getters and setters
}
在我的DatabaseHelper中,我尝试创建表:

//DatabaseHelper
...
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
    try {
        Log.i(TAG, "onCreate");
        TableUtils.createTable(connectionSource, PhytoterapicContent.class);
        Log.i(TAG, "Created table PhytoterapicContent");

        TableUtils.createTable(connectionSource, PhytoterapicItem.class);
        Log.i(TAG, "Created table PhytoterapicItem");
    catch{
       ...
    }
此时将创建表内容。但我得到了以下错误:

java.sql.SQLException:字段“contentItens”列名的外部集合类br.com.project.model.ContentItem不包含类br.com.project.model.phytterapicItem的外部字段


因此,异常消息的目的是在这里提供帮助。要在删除类名的情况下引用它,请执行以下操作:

字段
contentItens
的外部集合类
ContentItem
列名不包含类
PhytoterapicItem

看来是这样的。无论何时拥有
ForeignCollection
,该集合包含的类都必须有一个外部字段返回到父类

在您的例子中,
phyterapicitem
扩展了
DomainItem
类,该类具有
ContentItem
对象的
ForeignCollection
。这意味着
ContentItem
必须具有类型为
PhytoterapicItem
的外部字段。否则,如何知道表中的哪些
ContentItem
项与特定的
PhytoterapicItem
关联


中的
Account
Order
对象的示例可能对您的架构有所帮助。每个
帐户
都有一个
订单
对象的外部集合。无论何时查询
帐户
都会执行单独的查询,以查找与特定
帐户
对应的
订单
对象的集合。这意味着每个
订单
都必须有一个外部
帐户
对象。

我花了一段时间才从文档()中注意到/理解这个关键块:

请记住,当您拥有ForeignCollection字段时,集合中的类必须(按此示例顺序)拥有集合的类(在本示例中为Account)的外部字段。如果帐户具有订单的外部集合,则订单必须具有“帐户外部”字段。它是必需的,以便ORMLite可以找到与特定帐户匹配的订单

我之所以感到困惑是因为我没有找到任何示例代码(在文档或示例项目中),其中“包含的类”引用了集合中的类。它是口头描述的,但考虑到关系的性质——对于一些人来说,我认为在最初几次看到它时,这种描述可能有点难以理解

正如上面在原始问题中所列出的(这是我最终获得尝试我偶然发现的解决方案的想法的原因),下面的示例块似乎是在OrmLite中映射一对多集合关系的正确方法

此外,还有一个关于如何将collection holder类设置为collection元素类的说明


以下是需要注意的主要步骤:

A.在具有集合的类中(本例中为DomainItem),按以下方式注释集合字段:

@ForeignCollectionField(eager=true)

B.在集合中包含的类中(在本例中为ContentItem),必须有一个对包含集合的父类的显式引用:

@DatabaseField(foreign=true)
受保护的DomainItem DomainItem

C.在持久化ContentItem之前,必须将DomainItem保存到该ContentItem,以便将外键设置回DomainItem:

curContentItem.setDomainItem(curDomainItem);

contentItemDao.create(curContentItem);`
当我的藏品一开始没有被取回时,我就发现了这一点。我查看了ContentItem表,但DomainItem\u id从未设置在那里

例如:

public class DomainItem {

    @DatabaseField(generatedId = true)
    protected long id;

    @ForeignCollectionField(eager = false)
    protected ForeignCollection<ContentItem> contentItens;

    // ...
}


public class ContentItem {

    @DatabaseField(generatedId = true)
    protected long id;

    @DatabaseField(foreign = true)
    protected DomainItem domainItem;

    public void setDomainItem(DomainItem domainItem) {

       this.domainItem = domainItem;
    }
}
公共类DomainItem{
@数据库字段(generatedId=true)
保护长id;
@ForeignCollectionField(eager=false)
受保护的外国收藏品;
// ...
}
公共类ContentItem{
@数据库字段(generatedId=true)
保护长id;
@数据库字段(外部=真)
受保护的DomainItem DomainItem;
公共无效setDomainItem(DomainItem DomainItem){
this.domainItem=domainItem;
}
}

有效!我找出了抽象类之间的关系。现在它们在每个“项目”和各自的“内容”中。谢谢!!!
curContentItem.setDomainItem(curDomainItem);

contentItemDao.create(curContentItem);`
public class DomainItem {

    @DatabaseField(generatedId = true)
    protected long id;

    @ForeignCollectionField(eager = false)
    protected ForeignCollection<ContentItem> contentItens;

    // ...
}


public class ContentItem {

    @DatabaseField(generatedId = true)
    protected long id;

    @DatabaseField(foreign = true)
    protected DomainItem domainItem;

    public void setDomainItem(DomainItem domainItem) {

       this.domainItem = domainItem;
    }
}