Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android OrmLite外键/外键集合_Java_Android_Ormlite_Foreign Collection - Fatal编程技术网

Java Android OrmLite外键/外键集合

Java Android OrmLite外键/外键集合,java,android,ormlite,foreign-collection,Java,Android,Ormlite,Foreign Collection,在我最近的Android项目中,我使用OrmLite对一对多关系以及简单的一对一关系进行建模。 我注意到,在一对多关系中,子对象在数据库中持有对父对象的外键引用。不过,当加载父对象时,OrmLite知道该做什么,并加载子元素的集合,这当然是所需的行为 但是,对于简单的一对一关系,似乎需要父对象持有外键列才能实现相同的行为 因此,实际的问题是:当外键只在子对象中设置时,OrmLite是否可能以一对一的关系加载子对象,因为这是一对多关系的标准行为 下面是一些示例代码: @DatabaseTable

在我最近的Android项目中,我使用OrmLite对一对多关系以及简单的一对一关系进行建模。 我注意到,在一对多关系中,子对象在数据库中持有对父对象的外键引用。不过,当加载父对象时,OrmLite知道该做什么,并加载子元素的集合,这当然是所需的行为

但是,对于简单的一对一关系,似乎需要父对象持有外键列才能实现相同的行为

因此,实际的问题是:当外键只在子对象中设置时,OrmLite是否可能以一对一的关系加载子对象,因为这是一对多关系的标准行为

下面是一些示例代码:

@DatabaseTable
public class Parent
{  

@DatabaseField(foreign = true)
private Child1 child1;

@ForeignCollectionField
private Collection<Child2> children2;

}
因此,在拯救一个孩子时,我只需设置

child2.setParent(parent);
child2Dao.create(child2)
但为了在查询父对象(包括child1和child2)时达到相同的行为,我必须以另一种方式保存关系:

parent.setChild1(child1)
parentDao.create(parent)
这非常不方便,因为我希望child1/child2同时持有父级的外键,或者相反。但是一种混合物似乎有点难看

有什么办法可以做到这一点吗

我在这里寻找那个问题的答案,但找不到。如果是复制品,我很抱歉

多谢各位

编辑:

更准确地说: 是否可以在我的child1表中设置外键,并且在查询父项时仍然能够获取child1。奥姆利特为国外儿童收藏自动完成这项工作2。我希望孩子们也有同样的行为。 但当我开始

child1.setParent(parent);
child1Dao.create(child1);
然后进行查询

Parent parent = parentDao.queryForId(1)
由于父表没有对child1的引用(外键),因此仅获取child2。只有child1具有对父对象的引用

所以:我想让OrmLite自动更新父外键列,或者告诉OrmLite即使在父外键中没有设置外键也仍然获取child1(因为child2的集合就是这样)。 这有可能吗?还是不

我希望这不会太让人困惑:)我完全知道在父级中设置外键会更简单。但我真的不喜欢这种方法,因为我最终会让一些孩子拥有父母的外键,而另一些孩子则没有


非常感谢

ORMLite支持“外来”对象的概念,其中一个或多个字段对应于一个对象,并保存在同一数据库的另一个表中。例如,如果数据库中有一个Order对象,并且每个Order都有一个对应的Account对象,那么Order对象将有一个foreign Account字段。对于外部对象,只有帐户中的id字段作为列“Account\u id”持久化到Order表中。例如,Order类可能类似于:

@DatabaseTable(tableName = "orders")
public class Order {

    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(canBeNull = false, foreign = true)
    private Account account;
    …
}
创建订单表时,将生成类似以下SQL的内容:

CREATE TABLE `orders`
   (`id` INTEGER AUTO_INCREMENT , `account_id` INTEGER,
    PRIMARY KEY (`id`)); 
使用外来对象创建字段时,请注意,不会自动为您创建外来对象。如果外部对象具有由数据库提供的生成id,则需要在创建引用它的任何对象之前创建它。例如:

Account account = new Account("Jim Coakley");
accountDao.create(account);
// this will create the account object and set any generated ids

// now we can set the account on the order and create it
Order order = new Order("Jim Sanders", 12.34);
order.setAccount(account);
…
orderDao.create(order);
public class Account {
    …
    @ForeignCollectionField(eager = false)
    ForeignCollection<Order> orders;
    …
}
外部集合允许您在account表上添加订单集合。每当查询返回或DAO刷新Account对象时,都会对order表进行单独的查询,并在Account上设置订单集合。集合中的所有订单都具有与帐户匹配的相应外部对象。例如:

Account account = new Account("Jim Coakley");
accountDao.create(account);
// this will create the account object and set any generated ids

// now we can set the account on the order and create it
Order order = new Order("Jim Sanders", 12.34);
order.setAccount(account);
…
orderDao.create(order);
public class Account {
    …
    @ForeignCollectionField(eager = false)
    ForeignCollection<Order> orders;
    …
}
公共类帐户{
…
@ForeignCollectionField(eager=false)
外汇托收令;
…
}
在上面的示例中,
@ForeignCollectionField
注释标记orders字段是与帐户匹配的订单的集合。订单的字段类型必须是ForeignCollection或Collection–不支持任何其他集合,因为它们的重量要大得多,需要支持许多方法

来源:

根据,默认情况下,数据库字段为canBeNull=true。因此,在创建Child1时不必设置父项。要在父级中获取子级,反之亦然,可以将foreignAutoRefresh设置为true


如果您只想将外键列保留在一个表中,您可以通过设置maxForeignAutoRefreshLevel=1来实现这一点。

非常感谢您的快速响应!我完全了解ORM的基本功能,因为我来自MS实体框架。看来我的问题不是很清楚,我会尝试更新。所以请看一下编辑。实际上,我可能需要一个@ForeignField(我假设它在OrmLite中不存在)之类的东西,它不存储外键,但告诉OrmLite在查询帐户(父项)时包含订单(子项)。谢谢您的回复!不幸的是,这不是我想要的。我了解外国人,但我的问题指向另一个方向。我会更新我的问题。我理解你的问题。我在ORMLite文档中也没有找到答案,您可以尝试将问题发送给ORMLite开发团队。