【问题标题】:How do I create a JoinTable which includes both a primitive and a composite primary key as the tables composite key (Spring JPA)?如何创建一个包含原始和复合主键作为表复合键(Spring JPA)的 JoinTable?
【发布时间】:2020-04-28 23:24:12
【问题描述】:

我有一个用户、玩家、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;
}

【问题讨论】:

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


    【解决方案1】:

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

    至于您的 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 或?

    【讨论】:

      猜你喜欢
      • 2022-01-28
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多