【发布时间】:2015-11-16 09:36:39
【问题描述】:
我想知道,有没有可能有这样的东西。假设我有一张名为material 的表:
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(255) | YES | | NULL | |
| price | decimal(19,2) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
在 Java 端实体是:
@Entity
@DiscriminatorValue("M")
public class Material extends Expense {
private String name;
private BigDecimal price;
// Getters and setters
}
和名为occupation的表:
+--------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(255) | YES | | NULL | |
| payment_type | varchar(255) | YES | | NULL | |
| price | decimal(19,2) | YES | | NULL | |
+--------------+---------------+------+-----+---------+-------+
在 Java 端实体是:
@Entity
@DiscriminatorValue("O")
public class Occupation extends Expense {
private String name;
private BigDecimal price;
@Enumerated(EnumType.STRING)
private PaymentType paymentType;
// Getters and setters
}
现在假设我想在 Java 端为 Occupation 和 Material 创建一个名为 Expense 的通用类,代表材料和职业的费用。看起来像这样:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "expense_type", discriminatorType = DiscriminatorType.STRING)
public class Expense {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
// Getters and setters
}
在 SQL 方面:
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| expense_type | varchar(31) | NO | | NULL | |
| id | int(11) | NO | PRI | NULL | auto_increment |
+--------------+-------------+------+-----+---------+----------------+
但是,问题是我们引入继承时,费用的主键是材料和职业表中的外键。费用表是否有可能有自己的主键,并以某种方式保存材料和职业的 id 和鉴别器类型,以便材料和职业表可以有具有相同 id 的行(如材料中的34 id 和职业中的34 id桌子)?我的意思是,在 SQL 端它可以很容易地完成,但是在 Java 端呢?
【问题讨论】: