JPA和Hibernate中@MapKey,@ MapKeyColumn和@MapKeyJoinColumn的区别

根据Hibernate文档 ,如果我们想将Map用作实体之间的关联,则可以使用多个注释。 医生说:

或者,映射键映射到专用列。 要自定义映射,请使用以下注释之一:

@MapKeyColumn如果map键是基本类型。 如果未指定列名,则使用属性的名称,后跟下划线,后跟KEY(例如orders_KEY)。 @MapKeyEnumerated / @MapKeyTemporal如果映射键类型分别是枚举或日期。 @ MapKeyJoinColumn / @ MapKeyJoinColumns如果映射键类型是另一个实体。 当地图键是可嵌入对象时,@ AttributeOverride / @ AttributeOverrides。 使用密钥。 作为可嵌入对象属性名称的前缀。 如果不使用generics,也可以使用@MapKeyClass来定义键的类型。

通过一些示例,我能够理解@MapKey仅用于将键映射到目标实体的属性,并且该键仅用于获取记录。 @MapKeyColumn用于将键映射到目标实体的属性,该键用于保存和获取记录。 如果这是正确的,请告诉我?

当我需要使用@ MapKeyJoinColumn / @ MapKeyJoinColumns和@MapKeyEnumerated / @MapKeyTemporal时,请告诉我

谢谢!

使用Map您始终需要关联至少两个实体。 假设我们有一个与Car实体相关的Owner实体( Car有一个FK给Owner )。

所以, Owner将有一张Car(s) Map

 Map 
  1. @MapKey将为您提供Car's属性,用于将Car分组给其Owner 。 例如,如果我们在Car有一个vin (车辆识别号)属性,我们可以将它用作carMap键:

     @Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKey(name = "vin") private Map carMap; } @Entity public class Car { @Id private long id; @ManyToOne private Owner owner; private String vin; } 
  2. @MapKeyEnumerated将使用来自Car的Enum,如WheelDrive

     @Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKeyEnumerated(EnumType.STRING) private Map carMap; } @Entity public class Car { @Id private long id; @ManyToOne private Owner owner; @Column(name = "wheelDrive") @Enumerated(EnumType.STRING) private WheelDrive wheelDrive; } public enum WheelDrive { 2WD, 4WD; } 

    这将按照WheelDrive类型对汽车进行分组。

  3. @MapKeyTemporal将使用Date / Calendar字段进行分组,例如createdOn

     @Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKeyTemporal(TemporalType.TIMESTAMP) private Map carMap; } @Entity public class Car { @Id private long id; @ManyToOne private Owner owner; @Temporal(TemporalType.TIMESTAMP) @Column(name="created_on") private Calendar createdOn; } 
  4. @MapKeyJoinColumn需要第三个实体,例如Manufacturer以便您拥有从OwnerCar的关联,并且汽车也与Manufacturer有关联,以便您可以按Manufacturer所有Owner's进行分组:

     @Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKeyJoinColumn(name="manufacturer_id") private Map carMap; } @Entity public class Car { @Id private long id; @ManyToOne private Owner owner; @ManyToOne @JoinColumn(name = "manufacturer_id") private Manufacturer manufacturer; } @Entity public class Manufacturer { @Id private long id; private String name; }