为JPA / Hibernate与人工Long ID创建复合密钥

时间:2019-06-19 05:30:20

标签: java hibernate jpa

在jpa中仅包含两列(都是主键的一部分)的实体中映射实体的更好方法是什么?

  1. 自引用实体Java类作为主键
  2. 为主键创建POJO
  3. 引入“长ID”作为人工ID,以避免映射组合键

2 个答案:

答案 0 :(得分:2)

您想要的听起来像是多对多关系。如果没有其他选择,只能为此创建一个实体。

  

首先,创建可嵌入的复合密钥

@Embeddable
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BaseKey {
    private String a;
    private String b;
}
  

第二,创建您的实体

@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AnyEntity {

    @EmbeddedId
    private BaseKey key;

}

答案 1 :(得分:-1)

我将选择选项3,将surrogate key作为长ID。因为您希望避免在复合键的一部分发生更改的情况下更新多行。还要注意,甚至索引引用也必须更新。

例如-在下面的情况下,假设公司ID /雇员没有更改,那么在雇员和电话表的情况下,您将需要更新多行。

Employee                    Phone   
---------                   --------
Company ID (PK)             Phone no
Employee No (PK)            Company ID (FK)
Name                        Employee No (FK)

相反,如果您在Employee中添加代理密钥,则在Employee表中仅单个更新。

Employee                    Phone   
---------                   --------
ID (PK)                     Phone no
Company ID (UK)             Employee ID (FK)
Employee No (UK)            
Name