#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;
// ...
}