我不明白如何使用@MapKey

时间:2013-04-26 08:48:07

标签: java hibernate

我使用注释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"

3 个答案:

答案 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。