java - 如何创建一个包含原始主键和复合主键作为表复合键的 JoinTable(Spring JPA)?

标签 java hibernate spring-boot jpa spring-data-jpa

我有一个 Users、Players、CoopGames 和 CoopGamesPlayers 表。从概念上讲,我本质上是在尝试重新创建 Order/OrderProducts 类型关系。就我而言,每个 CoopGamesPlayers 条目的键都是 CoopGame id 和 Player id。但是,我陷入困境,因为在我的情况下,我的 Player 类本身有一个复合主键:生成的玩家 id 以及用户 id 外键。我有点迷失了。我已经按照 Order.OrderProducts 教程进行了设置,但我不是 JPA 专家,也从未在 JoinTable 中真正使用过复合键。代码:

public class PlayerPK implements Serializable {

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "id")
    private Player player;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "userid")
    private User user;
}

@Entity
@Table(name = "players")
public class Player implements Serializable {

    @EmbeddedId
    private PlayerPK pk;

    @Column(name = "image")
    private String image;
}

@Entity
@Table(name = "coop_games")
public class CoopGame {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToMany(mappedBy = "pk", fetch = FetchType.EAGER)
    private List<CoopGamesPlayers> players;
}

public class CoopGamesPlayersPK implements Serializable {

    @JsonBackReference
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "coop_game_id")
    private CoopGame game;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name="playerid", referencedColumnName="id"),
        @JoinColumn(name="userid", referencedColumnName="userid")
    })
    @MapsId("pk")
    private Player player;
}

@Entity
@Table(name = "coop_games_players")
public class CoopGamesPlayers {

    @EmbeddedId
    private CoopGamesPlayersPK pk;

    public CoopGamesPlayers(CoopGame game, Player player) {
        pk = new CoopGamesPlayersPK();
        pk.setGame(game);
        pk.setPlayer(player);
    }
}

@Entity
@Table(name = "coop_games")

public class CoopGame {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToMany(mappedBy = "pk", fetch = FetchType.EAGER)
    private List<CoopGamesPlayers> players;
}

最佳答案

我认为你应该更好地重新考虑你的数据模型与所有关系(应该解决哪个问题?..)。

对于您的 CoopGamesPlayers 表:如果您只想将 CoopGamesPlayers 用作可连接项,则不需要 CoopGamesPlayersPK。

CoopGame 和 CoopGamesPlayers 应该看起来像这样:

@Entity
@Table(name = "coop_games")
public class CoopGame {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToMany(mappedBy = "game", fetch = FetchType.EAGER)
    private List<CoopGamesPlayers> players;
}

@Entity
@Table(name = "coop_games_players")
public class CoopGamesPlayers {

    @EmbeddedId
    private PlayerPK pk;

    @JsonBackReference
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "coop_game_id")
    private CoopGame game;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name = "playerid", referencedColumnName = "id"),
            @JoinColumn(name = "userid", referencedColumnName = "userid")
    })
    @MapsId("id") 
    private Player player;
}

@MapsId("id") - id 因为你希望玩家 id 为 fk 或?

关于java - 如何创建一个包含原始主键和复合主键作为表复合键的 JoinTable(Spring JPA)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59696440/

相关文章:

java - 使用 DiscriminatorFormula 迁移 Hibernate 数据库是不好的做法吗?

java - 如何获取类的 View ,该类扩展了扩展 fragment/Activity 等的类

java - spring hibernate jpa中的多对一关系

java - spring-boot:我可以修复 spring-boot 2 中的下一个错误吗?

java - ArangoDB Spring Data 2,java.lang.Object/无效的映射类型

spring-boot - 浏览器 HEAVYWEIGHT 在场景中不可见

java - RecyclerView 滚动时扩展项目之间的空间

java - Apache Beam 中是否支持 Azure Blob?

hibernate - Java EE 容器中的 JPA 异常翻译

java - SQL Server 环境问题,SQL Error 207 Invalid column name sqlstate 42s22