Berkeley DB 中的外键

Posted

技术标签:

【中文标题】Berkeley DB 中的外键【英文标题】:Foreign Key in Berkeley DB 【发布时间】:2014-04-15 01:26:32 【问题描述】:

我有两个实体:

第一个是:

public class WordEntity 
    @PrimaryKey
    private String content;

    private int wordId;

第二个是:

public class LexiconEntity 
    @SecondaryKey(relate = Relationship.ONE_TO_ONE, relatedEntity = WordEntity.class)// it does not work
    private int wordId;

    private int numDocs;

我想将LexiconEntitywordId 作为WordEntity 的外键。我该怎么做?

【问题讨论】:

LexiconEntity 不应该也有 PrimaryKey 吗?编译器是否产生任何错误? 【参考方案1】:

迟到的答案,但是...首先,对于 WordEntity,wordId 看起来会是更自然的 PK。 LexiconEntity 还应该定义一个 PrimaryKey。 WordEntity 应该定义引用 LexiconEntity 的 SecondaryKey 或“指定与该实体相关的实体”。

public class WordEntity 
    @PrimaryKey
    private int wordId;
    private String content;
    @SecondaryKey(relate = Relationship.ONE_TO_ONE, relatedEntity = LexiconEntity.class)
    private int lexId;


public class LexiconEntity 
    @PrimaryKey
    private int lexId;
    private int numDocs;

因此数据为:

词典实体: lexId ----- 100 101 102 字实体: wordId lexId ------ ----- 1 100 2 101 3 102

由于关系是 one_to_one,因此辅助键对于定义它的对象是唯一的。所以在这种情况下,lexId 在 WordEntity 中是唯一的,所以你不能拥有:

字实体: wordId lexId ------ ----- 1 100 2 101 3 100 -- 插入异常,因为它是重复的

见http://docs.oracle.com/cd/E17277_02/html/GettingStartedGuide/dplindexcreate.html#dplsecondaryidxdecl http://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/persist/model/SecondaryKey.html#relatedEntity()

【讨论】:

以上是关于Berkeley DB 中的外键的主要内容,如果未能解决你的问题,请参考以下文章

Berkeley DB 中的突变错误

Berkeley-DB:多个数据库上的原子事务

查询 Berkeley DB 中的模式实现

berkeley db java中的多个键

Berkeley DB 中的函数指针迭代器

无法从 C 中的 Berkeley DB 检索值