Spring boot Spring Boot中的多个@JoinTable(JPA)
我有以下代码(Spring Boot)可以完美地工作:Spring boot Spring Boot中的多个@JoinTable(JPA),spring-boot,jpa,spring-data-jpa,Spring Boot,Jpa,Spring Data Jpa,我有以下代码(Spring Boot)可以完美地工作: @Getter @Setter @ManyToMany(fetch = FetchType.LAZY) @Column(name = "fight") @JoinTable(name = "fighter_fight", joinColumns = {@JoinColumn(name = "fighter_id")}, inverseJoinColumns = {@JoinColumn(name = "fig
@Getter
@Setter
@ManyToMany(fetch = FetchType.LAZY)
@Column(name = "fight")
@JoinTable(name = "fighter_fight",
joinColumns = {@JoinColumn(name = "fighter_id")},
inverseJoinColumns = {@JoinColumn(name = "fight_id")})
private Set<Fight> fights;
我得到一个错误(“重复属性列”)。如何在同一个表中有两个列(在我的例子中<代码>战斗机< /代码>?首先,你应该考虑你是否描述了正确的模式。如果您只有fighter1和fighter2,那么您可能正在谈论两种
manytone
关系,如下所示:
这应该很容易建模。如果您认为您实际上有一个manytomy
关系,可能是为了WWE或其他原因,并且您希望在关系中添加一个属性,那么您需要一个具有属性的关系,如下所示:
这不是一个罕见的模式需求,通过与新实体的两个manytone
关系实现,如下所示:
为此,简单的JPA实体需要一个可嵌入的
实体用作可嵌入的leid
,如下所示:
@Entity
@Data
public class Fight {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
@Data
public class Fighter {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
@Data
public class Fights {
@EmbeddedId
private FightsPK id;
@MapsId("fighterId")
@ManyToOne
private Fighter fighter;
@MapsId("fightId")
@ManyToOne
private Fight fight;
private String fId;
}
@Embeddable
@Data
public class FightsPK implements Serializable {
private static final long serialVersionUID = 1L;
private Long fighterId;
private Long fightId;
}
使用它会有点尴尬,但也是可行的:
private void create() {
Fighter f1 = new Fighter();
fighterRepo.save(f1);
Fighter f2 = new Fighter();
fighterRepo.save(f2);
Fight f = new Fight();
fightRepo.save(f);
Fights f1s = new Fights();
f1s.setId(new FightsPK());
f1s.setFighter(f1);
f1s.setFight(f);
f1s.setFId("f1");
fightsRepo.save(f1s);
Fights f2s = new Fights();
f2s.setId(new FightsPK());
f2s.setFighter(f2);
f2s.setFight(f);
f2s.setFId("f2");
fightsRepo.save(f2s);
}
fId
字段是一个字符串,因此您可以在其中输入任何内容,例如,如果一个拳击组织者需要在字段中输入自己的名称。您可能需要重新考虑是否需要最初描述的关系。只有两架战斗机时,您可以在战斗
中为fighter1和fighter1名称添加其他字段。如果您需要第三列,则此表不再是用于映射战斗机和战斗之间多个关联的联接表。它是另一种东西,需要用不同的实体模型来建模。
private void create() {
Fighter f1 = new Fighter();
fighterRepo.save(f1);
Fighter f2 = new Fighter();
fighterRepo.save(f2);
Fight f = new Fight();
fightRepo.save(f);
Fights f1s = new Fights();
f1s.setId(new FightsPK());
f1s.setFighter(f1);
f1s.setFight(f);
f1s.setFId("f1");
fightsRepo.save(f1s);
Fights f2s = new Fights();
f2s.setId(new FightsPK());
f2s.setFighter(f2);
f2s.setFight(f);
f2s.setFId("f2");
fightsRepo.save(f2s);
}