我使用 hibernate 注释,我有这个源
@Table(name = "stats")
public class Stat {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private long id;
@ManyToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY)
@JoinColumn(name = "player_id")
private PPlayer player;
@Column(name = "stat_type")
private int type;
@Column(name = "stat_value")
private int value;
}
@Entity
@Table(name = "Users")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class PPlayer {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "user_id")
private long id;
private String username;
private String email;
private Date joiningDate;
private String key;
private String password;
private int rank;
private int score;
@OneToMany(mappedBy = "player", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@MapKey(name = "type")
private Map<Integer, Stat> stats;
}
我看了很多文档,但我看不懂@MapKey
name = "type"是什么意思?
为什么是"type"
?我可以在哪个类(class)查看它?
我在哪里可以找到 mappedBy = "player"
?
最佳答案
mappedBy='player'
引用 Stat
类的 player
属性 - 它是关系的拥有方。
name = "type"
引用同一个 Stat
类的 type
属性 - 它表示 >Map
映射到不同类型的 Stat
。
编辑:注释中的值与表列名称不对应可能会令人困惑。列名称默认为字段名称,但在您的实体中,使用 @Column
注释来覆盖列名称
Hibernate 和 JPA 使用字段名称作为关系注释,而不是列名称,除非另有指定(例如 JoinColumn
等)。
要记住的一个很好的启发式是 - 当注释中没有“列”时,您可以假设涉及字段名称。我不确定它是否100%适用,但在大多数情况下确实如此。
关于java - 我不明白如何使用@MapKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16232272/