Как реализовать ассоциацию карт в сущности

#java #hibernate #jpa

#java #переход в спящий режим #jpa

Вопрос:

Я пытаюсь реализовать map в моей сущности, но я не знаю как:

 public class Match {
private Long id;

    @Builder.Default
    @ManyToMany(targetEntity = Coupon.class,
            mappedBy = "matchList")
    private List<Coupon> couponList = new ArrayList<>();
}
  
 public class Coupon {
private Long id;

    @ManyToMany
    @JoinTable(
            name = "JOIN_MATCH_ID",
            joinColumns = {@JoinColumn(name = "MATCH_ID", referencedColumnName = "ID")},
            inverseJoinColumns = {@JoinColumn(name = "COUPON_ID", referencedColumnName = "ID")})
    private Map<Match, Integer> mapList = new HashMap<>();
  

Как я должен реализовать эти поля?

Ответ №1:

В качестве одного из возможных подходов вы можете использовать следующее сопоставление.

Предполагая, что у вас есть следующая схема базы данных:

 create table TST_MATCH
(
   mt_id int not null,
   primary key (mt_id)
);

create table TST_COUPON
(
   cn_id int not null,
   primary key (cn_id)
);

create table TST_MATCH_COUPON
(
   match_id int not null,
   coupon_id int not null,
   UNIQUE (match_id, coupon_id),
   foreign key (match_id) references TST_MATCH(mt_id),
   foreign key (coupon_id) references TST_COUPON(cn_id)
);
  

Ваше отображение может быть таким:

 @Entity
@Table(name = "TST_MATCH")
public class Match
{
   @Id
   @Column(name = "mt_id")
   private Integer id;
   
   @ManyToMany(mappedBy = "matchs", cascade = CascadeType.ALL)
   private List<Coupon> coupons;
   
   // ...
}

@Entity
@Table(name = "TST_COUPON")
public class Coupon
{
   @Id
   @Column(name = "cn_id")
   private Integer id;

   @ManyToMany(cascade = CascadeType.ALL)
   @JoinTable(
      name = "TST_MATCH_COUPON",
      inverseJoinColumns = { @JoinColumn(name = "match_id", referencedColumnName = "mt_id") },
      joinColumns = { @JoinColumn(name = "coupon_id", referencedColumnName = "cn_id") }
   )
   @MapKey(name = "id")
   private Map<Integer, Match> matchs;
   
   // ...
}