2011-05-06 93 views
0

现在,我在使用Hibernate映射链接表时遇到问题。映射链接表与休眠状态下的3个PK

首先,我想解释我想要映射的内容: 我有3个表格:Product,DocumentType,Language。

一个产品可以在每个DocumentType(目前,我们有7个DocumentTypes)在每个特定语言(目前我们有3种语言)这意味着产品的“1”可以有DocumentType“A”,在语言

“EN”,“ES”和“FR”。

我用3个外键创建了一个链接表,它们也是复合主键。

这是我的SQL看起来像。

CREATE TABLE Person(
    id int PRIMARY KEY AUTO_INCREMENT, 
    name varchar(255) 
); 

CREATE TABLE DocumentType(
    id int PRIMARY KEY AUTO_INCREMENT, 
    name varchar(255), 
    key varchar(255) 
); 

CREATE TABLE Language(
    id int PRIMARY KEY AUTO_INCREMENT, 
    name varchar(255), 
    code varchar(2) 
); 

CREATE TABLE Person_DocumentType_Language(
    person_id int NOT NULL, 
    doc_id int NOT NULL, 
    lang_id NOT NULL, 
    FOREIGN KEY(person_id) 
    REFERENCES Person(id), 
    FOREIGN KEY(doc_id) 
    REFERENCES DocumentType(id), 
    FOREIGN KEY(lang_id) 
    REFERENCES Language(id), 
    PRIMARY KEY(person_id, doc_id, lang_id) 
); 

通过最后一个链接表,我可以知道哪个Person具有哪些DocumentTypes以及哪些语言。 我最感兴趣的是DocumentType具有哪个语言的人。

说我是人A.现在我想知道哪些DocumentTypes与哪些语言。在SQL它看起来像这样我认为:

Select doc_id, lang_id from Person_DocumentType_Language where person_id=1 

这有道理吗?我怎么能把这个映射到Hibernate中呢?

回答

0

一种方法是从到LanguageMap。我在确切注释上有点生疏,但这是一个开始:

public class Person { 

    @Id 
    public int id; 

    @OneToMany(targetEntity=Language.class) 
    @MapKeyClass(Integer.class) 
    @CollectionTable(name="Person_DocumentType_Language") 
    @MapKeyColumn(name="doc_id") 
    public Map<DocumentType,Language> docTypeLang; 
}