簡體   English   中英

Hibernate-繼承中的外鍵和主鍵

[英]Hibernate - Foreign and primary keys in inheritance

我想知道,是否可能有這樣的事情。 假設我有一個名為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方面為OccupationMaterial創建一個通用類,稱為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方面又如何呢?

根據休眠文檔,嘗試:

@PrimaryKeyJoinColumn和@PrimaryKeyJoinColumns批注定義了聯接子類表的主鍵:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Boat implements Serializable { ... }

@Entity
@PrimaryKeyJoinColumn(name="BOAT_ID")
public class AmericaCupClass  extends Boat { ... }    

https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168

還要看一下PrimaryKeyJoinColumn javadoc,它具有:

(可選)要連接的表的主鍵列的名稱。 默認名稱與超類主表的主鍵列相同( JOINED映射策略); 與主表的主鍵列同名( SecondaryTable映射); 或與引用實體表的主鍵列相同的名稱( OneToOne映射)。

字符串引用的columnName()

我認為正是你所需要的

根據JPA 2.0規范,這是不可能的。 它在第2.4節(主鍵和實體標識)中說:

必須在作為實體層次結構根的實體類上或在作為實體層次結構中所有實體類的(直接或間接)超類的映射超類上定義主鍵。 在實體層次結構中,主鍵必須定義一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM