我使用注释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"
的含义是什么?我可以查看它的类?
我可以在哪里找到mappedBy = "player"
?
答案 0 :(得分:1)
mappedBy='player'
引用player
类的Stat
属性 - 它是关系的拥有方。
name = "type"
引用同一type
类的Stat
属性 - 它表示Map
中的值映射到不同类型的Stat
}。
编辑:注释中的值与表列名称不对应可能会造成混淆。列名默认为字段名称,但在您的实体中,使用@Column
注释覆盖列名称
Hibernate和JPA使用关系注释的字段名称,而不是列名称,除非另有指定(如JoinColumn
等)。
要记住的一个好的启发式方法是 - 当注释中没有“列”时,您可以假设关注字段名称。我不确定它是否适用于100%,但在大多数情况下确实如此。
答案 1 :(得分:0)
您是否尝试过使用以下休眠手册:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html
虽然上面的手册使用Map集合处理XML ORM映射,但基本原理与Hibernate中带注释的@MapKey
用法基本相同。
答案 2 :(得分:-4)
您可以查找MapKey的JavaDoc。