【问题标题】:How do you implement inheritance with tables that have multi-column/composite primary keys (JPA 1.0 @IdClass)?如何使用具有多列/复合主键(JPA 1.0 @IdClass)的表实现继承?
【发布时间】:2010-11-17 06:13:55
【问题描述】:

给定以下表格:

CREATE TABLE Employees
(
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL,
  birth_date DATE NOT NULL,
  PRIMARY KEY (first_name, last_name)
);

CREATE TABLE Managers
(
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL,
  salary INTEGER NOT NULL,
  total_bonus INTEGER NULL,
  PRIMARY KEY (first_name, last_name),
  CONSTRAINT managers_employees_fk FOREIGN KEY (first_name, last_name) REFERENCES Employees (first_name, last_name)
);

CREATE TABLE Workers
(
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL,
  wage INTEGER NOT NULL,
  PRIMARY KEY (first_name, last_name),
  CONSTRAINT workers_employees_fk FOREIGN KEY (first_name, last_name) REFERENCES Employees (first_name, last_name)
);

您将如何使用 JPA 1.0 @IdClass 注解实现实体和复合主键类?

出现的子问题是:

  1. 子类是否定义了自己的 ID 类?
  2. 如果是,它们是否继承自超类的 ID 类?
  3. 子类是否获得@IdClass 注解?

请注意,这个问题是故意幼稚的。我想看看类声明,没有getter和setter的带有字段访问注释的属性可能就足够了。

谢谢

【问题讨论】:

  • 请注意,(first_name, last_name) 对于主键来说是一个错误的想法。见this article。我个人认识至少一个没有名字的人。
  • 这只是示例,并不是真正选择的键。我知道其中的含义,但谢谢。

标签: java inheritance jpa annotations composite-primary-key


【解决方案1】:

PK 在继承树的根中定义。根定义一切。

规范说 必须在作为实体层次结构根的实体类或作为实体层次结构中所有实体类的(直接或间接)超类的映射超类上定义主键。主键必须在实体层次结构中只定义一次。

【讨论】:

  • 因此,继承关系/子表可能永远不会扩展主键列的集合???
  • 好吧,这也意味着子类没有得到任何@IdClass 注释?
  • 没错。您不能定义“在实体层次结构中一次”,在“根类”中定义它,然后也在子类中定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多