Внешний ключ в Berkeley DB

У меня есть две сущности:

Первый:

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;
}

Я хочу, чтобы wordId из LexiconEntity был внешним ключом WordEntity. Как я могу это сделать?


person CSnerd    schedule 15.04.2014    source источник
comment
не должен ли LexiconEntity также иметь PrimaryKey? Выдает ли компилятор какие-либо ошибки?   -  person wullxz    schedule 15.06.2014


Ответы (1)


Поздний ответ, но... Во-первых, похоже, что wordId будет более естественным PK для WordEntity. LexiconEntity также должен определять PrimaryKey. WordEntity должен определить SecondaryKey, который ссылается на LexiconEntity или «указывает объект, с которым связан этот объект».

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;
}

Следовательно, данные будут:

LexiconEntity:
lexId
-----
100
101
102

WordEntity:        
wordId  lexId
------  -----
1       100
2       101
3       102

Поскольку это отношение «один к одному», вторичный ключ уникален для определяющего его объекта. Итак, в этом случае lexId уникален в WordEntity, поэтому вы не можете иметь:

WordEntity:        
wordId  lexId
------  -----
1       100
2       101
3       100 -- Exception on insert since it is a dup

См. 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()

person pjscore10    schedule 30.10.2014