2013-04-26 104 views
1

我使用注释冬眠我有thise源我不知道如何使用@MapKey

 @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"

回答

1

mappedBy='player'player属性FO的Stat类 - 它是关系的持有端。

name = "type"指同一Stat类的type属性 - 它说的是,在Map的值被映射到不同类型的Stat

编辑:注释中的值与表列名称不一致可能会引起混淆。列名默认为字段名,但在你的实体的列名被覆盖,使用@Column注释

Hibernate和JPA的关系注释,不列名,当另有规定除外(如JoinColumn等)使用的字段名。

要记住的一个好的启发是 - 当注释中没有'列'时,可以假定字段名称是关心的。我不确定它是否适用于100%,但在大多数情况下它确实适用。

+0

我展示了类Stat,因为在注释 - 类Stat中缺少“type”和“player”。class Stat有“stat_type”(int类型)和“player_id”(类型PPlayer),或者我不明白? – 2013-04-26 09:16:16

+0

@MaxUsanin - 这似乎是一个误解 - 我已经添加了一些更多的信息来澄清,请参阅编辑。 – kostja 2013-04-26 09:26:16

+0

是的,谢谢,你已澄清 – 2013-04-26 09:29:40

-4

您可以查找MapKey的JavaDoc。

+0

对不起,但这个链接不告诉我任何东西 – 2013-04-26 09:01:44

+1

-1来吧,为什么不建议使用谷歌以及?这不是真的有帮助 – kostja 2013-04-26 09:08:01