Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring Boot中的多个@JoinTable(JPA)_Spring Boot_Jpa_Spring Data Jpa - Fatal编程技术网

Spring boot Spring Boot中的多个@JoinTable(JPA)

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

我有以下代码(Spring Boot)可以完美地工作:

@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);
}