1

我正在努力使用基于实体的复合主键映射一对多双向关系。我创建了一些代表我想做的类。它们只是制作出来的,因此更容易解释,但我认为它们传达了我正在努力做好的事情。

我没有实现一些接口/方法,但我可以确保当我不将锦标赛集添加到 Player/Game 实体时它可以工作。所以我的映射有问题。

当我试图找到一个实体(几乎做任何事情)时,Hibernate 4.x 会导致一个空标识符错误,而不再说明该错误。

当我在“一个”上有一个复合主键并且我想要双向导航时,映射它的正确方法是什么?

@Entity
@IdClass(TournamentPk.class)
public class Tournament {

    @Id
    @ManyToOne
    @JoinColumn("player_id")
    private Player player;  
    @Id
    @ManyToOne
    @JoinColumn("game_id")
    private Game game;
    private int score;

    // Getters and Setters
    // Hashcode and Equals
}

// Primary key class.
public class TournamentPk {

    private Player player;
    private Game game;

    // Getters and Setters
    // Hashcode and Equals
}


@Entity
public class Player {

    // ID
    // Other fields

    @OneToMany(fetchType = FetchType.EAGER, mappedBy = "player")
    private Set<Tournament> tournaments;

    // Getters and Setters
    // Hashcode and Equals
}

@Entity 
public class Game {

    // ID
    // Other fields

    @OneToMany(fetchType = FetchType.EAGER, mappedBy = "game")
    private Set<Tournament> tournaments;

    // Getters and Setters
    // Hashcode and Equals
}
4

1 回答 1

2

您的问题是您使用@Id不允许的类型(例如类型PlayerGame)的字段进行注释。有关详细信息,请参阅@Id注释的文档

注意完整性:一些引用允许使用@Id 注释的另一个实体类。

  1. 在您的位置,我将在您的实体中有一个独立的@Id private Long id;字段+对带有标准映射的 Game+Player 组合的约束。Tournament@Unique
  2. 如果您真的想坚持使用@IdClass,您可以尝试在锦标赛类中添加两个允许的字段(我在这里找到了类似的映射(搜索 @IdClass))。

  @Entity
  @IdClass(TournamentPk.class)
  public class Tournament {

    @Id
    @Column(name="player_id", insertable = false, updatable = false)
    private Long playerId;

    @ManyToOne
    @JoinColumn("player_id")//consider adding cascade=PERSIST
    private Player player;  

    @Id
    @Column(name="game_id", insertable = false, updatable = false)
    private Long gameId;

    @ManyToOne
    @JoinColumn("game_id")//consider adding cascade=PERSIST
    private Game game;
    private int score;

    // Getters and Setters
    // Hashcode and Equals
}

  public class TournamentPk {

    private Long playerId;
    private Long gameId;

    // Getters and Setters
    // Hashcode and Equals
 }
于 2013-11-01T09:15:03.950 回答