Ответ 1
Когда вы используете Map
, вам всегда нужно связать не менее двух объектов. Скажем, мы имеем объект Owner
, относящийся к объекту Car
(Car
имеет FK до Owner
).
Итак, Owner
будет иметь Map
of Car(s)
:
Map<X, Car>
-
@MapKey
даст вам полеCar's
, используемое для группировки несколькихCar(s)
вOwner
: -
@MapKeyEnumerated
будет использовать Enum изCar
, напримерWheelDrive
:@Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKeyEnumerated(EnumType.STRING) private Map<WheelDrive, Car> 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.
-
@MapKeyTemporal
будет использовать полеDate
/Calendar
для группировки, напримерcreatedOn
@Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKeyTemporal(TemporalType.TIMESTAMP) private Map<Date, Car> carMap; } @Entity public class Car { @Id private long id; @ManyToOne private Owner owner; @Temporal(TemporalType.TIMESTAMP) @Column(name="created_on") private Calendar createdOn; }
-
@MapKeyJoinColumn
требуется третья сущность, напримерManufacturer
, так что у вас есть связь отOwner
доCar
, а автомобиль также имеет связь сManufacturer
, так что вы можете группировать всеOwner's
Cars
наManufacturer
:@Entity public class Owner { @Id private long id; @OneToMany(mappedBy="owner") @MapKeyJoinColumn(name="manufacturer_id") private Map<Manufacturer, Car> 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; }