在我最近关于Android的项目中,使用OrmLite来模拟一对多关系以及简单的一对一关系。 我注意到,通过一对多关系,子进程拥有数据库中父对象的外键引用。仍然在加载父对象时,OrmLite知道该做什么并加载子元素的集合,这当然是所期望的行为。
但是,通过简单的一对一关系,父对象似乎需要持有外键列才能实现相同的行为。
所以实际的问题:当外键仅在子节点中设置时,是否有可能让OrmLite以一对一的关系加载子对象,因为它是具有一对多关系的标准行为?
以下是一些示例代码:
@DatabaseTable
public class Parent
{
@DatabaseField(foreign = true)
private Child1 child1;
@ForeignCollectionField
private Collection<Child2> children2;
}
因此,在1和2孩子中,我需要像这样引用父母:
public class Child1 / Child2
{
@DatabaseField(foreign = true)
private Parent parent;
}
因此,在保存child2时,我只需设置
child2.setParent(parent);
child2Dao.create(child2)
但是为了在查询包含child1和child2的父级时达到相同的行为,我必须以相反的方式保存关系:
parent.setChild1(child1)
parentDao.create(parent)
这非常不方便,因为我希望child1 / child2同时持有父母的外键或反之。但混合物似乎有些难看!
任何想法如何实现?
我在这里搜索了这个问题的答案但却找不到答案。如果它是重复的,我很抱歉!
非常感谢!
编辑:
更准确地说: 是否可以在我的child1表中设置外键,并且在查询Parent时仍然可以获取child1。 ORMLite自动为child2的外部集合做它。我希望child1具有相同的行为。 但是当我设置
child1.setParent(parent);
child1Dao.create(child1);
然后进行查询
Parent parent = parentDao.queryForId(1)
只获得child2,因为父表没有对child1的引用(外键)。只有child1具有对父级的引用。
所以:我想让OrmLite自动更新父外键列或告诉Ormlite仍然获取child1,即使在父项中没有设置外键(因为这与child2的集合完全一样)。 这有点可能吗?或者不是?
我希望这不会太令人困惑:)我完全清楚在外部设置外键会更简单。但我真的不喜欢这种方法,因为我最终会得到一些孩子有父母的外键和一些没有的外键。
非常感谢
答案 0 :(得分:0)
ORMLite支持&#34;外国&#34;的概念其中一个或多个字段对应于对象的对象将保留在同一数据库中的另一个表中。例如,如果数据库中有Order对象,并且每个Order都有一个对应的Account对象,那么Order对象将具有外部Account字段。对于外来对象,只需将帐户中的id字段作为列&#34; account_id&#34;保存到Order表中。例如,Order类可能类似于:
@DatabaseTable(tableName = "orders")
public class Order {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(canBeNull = false, foreign = true)
private Account account;
…
}
创建Order表时,将生成类似以下SQL的内容:
CREATE TABLE `orders`
(`id` INTEGER AUTO_INCREMENT , `account_id` INTEGER,
PRIMARY KEY (`id`));
使用异物创建字段时,请注意不会自动为您创建异物。如果您的外部对象具有由数据库提供的generated-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);
外国集合允许您在帐户表上添加订单集合。每当查询返回或由DAO刷新Account对象时,都会对订单表进行单独查询,并在帐户上设置订单集合。集合中的所有订单都具有与帐户匹配的相应外来对象。例如:
public class Account {
…
@ForeignCollectionField(eager = false)
ForeignCollection<Order> orders;
…
}
在上面的示例中,@ForeignCollectionField
注释标记订单字段是与帐户匹配的订单的集合。订单的字段类型必须是ForeignCollection或Collection - 不支持其他集合,因为它们比许多支持的方法要重得多。
答案 1 :(得分:0)
根据ORMLite documentation,默认情况下,DatabaseField的canBeNull = true。因此,在创建Child1时无需设置Parent。要获取Parent中的Childs,反之亦然,您可以设置foreignAutoRefresh = true。
如果要将外键列仅保留在一个表中,可以通过设置maxForeignAutoRefreshLevel = 1来实现。