【问题标题】:Mapping Linking Table with 3 PK's in Hibernate在 Hibernate 中使用 3 个 PK 映射链接表
【发布时间】:2011-08-20 04:18:24
【问题描述】:

现在我无法使用 Hibernate 映射链接表。

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

一个产品可以在每种特定语言中拥有每个 DocumentType(目前我们有 7 个 DocumentType)(目前我们有 3 种语言)

这意味着产品“1”可以使用语言“EN”、“ES”和“FR”的 DocumentType“A”。

我创建了一个带有 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 中映射它?

【问题讨论】:

    标签: java sql hibernate mapping


    【解决方案1】:

    一种方法是使用从DocumentTypeLanguageMap。我对确切的注释有点生疏,但这是一个开始:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 2017-03-13
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多