在多对多表中避免可以为空的外键

时间:2014-04-03 07:48:41

标签: sql database orm h2 ormlite

我有一个多对多的表,看起来有点像这样。 它通过ormlite访问并存储在嵌入式h2数据库中。

@DatabaseField(id = true)
private String id;

@DatabaseField(foreign = true, canBeNull = false, uniqueCombo = true, foreignAutoRefresh = true)
private ForeignOne foreignOne;

@DatabaseField(foreign = true, canBeNull = false, uniqueCombo = true, foreignAutoRefresh = true)
private ForeignTwo foreignTwo;

如果我尝试存储其中一个或两个外部成员 null 的实例,则DAO对象会按预期引发异常,因为注释状态 canBeNull = false

但是,如果将一个或两个外部成员设置为数据库中存在的实例,我可以执行插入数据库的操作,并在下次从中检索实例时数据库中插入时不存在的外来成员是 null

有什么方法可以避免这种情况吗?

由于

1 个答案:

答案 0 :(得分:2)

not null约束仅表示该字段不能为空,并不意味着它必须是有效密钥。如果要确保外键实际指向外表中的一行,则需要创建foreign key constraint,这在ORMLite中不完全支持。相反,你必须使用custom column definition,比如

@DatabaseField(foreign = true,
               columnDefinition = "integer references foreignOne(id)" )
private ForeignOne foreignOne;

让ORMLite创建一个。或者您可以自己创建h2数据库并包含一个。