Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate映射地图<;枚举,整数>;_Hibernate_Jpa_Map_Annotations - Fatal编程技术网

Hibernate映射地图<;枚举,整数>;

Hibernate映射地图<;枚举,整数>;,hibernate,jpa,map,annotations,Hibernate,Jpa,Map,Annotations,我正在使用Hibernate和JPA注释来映射我的类。当hibernate试图映射这个类时,我遇到了一个问题 @Entity @Table(name = "social_item") public class SocialItem extends Item { private SocialSlot slot; private Map<SocialStat, Integer> stats = new HashMap<SocialStat, Integer>

我正在使用Hibernate和JPA注释来映射我的类。当hibernate试图映射这个类时,我遇到了一个问题

@Entity
@Table(name = "social_item")
public class SocialItem extends Item {

    private SocialSlot slot;
    private Map<SocialStat, Integer> stats = new HashMap<SocialStat, Integer>();

    @Enumerated(EnumType.STRING)
    public SocialSlot getSlot() {
        return slot;
    }

    public void setSlot(SocialSlot slot) {
        this.slot = slot;
    }

    @MapKeyClass(value = SocialStat.class)
    @ElementCollection(targetClass = Integer.class)
    public Map<SocialStat, Integer> getStats() {
        return stats;
    }

    public void setStats(Map<SocialStat, Integer> stats) {
        this.stats = stats;
    }

}
我得到了这个错误:

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Map, at table: social_item, for columns: [org.hibernate.mapping.Column(stats)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:269)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)
    at org.hibernate.mapping.Property.isValid(Property.java:185)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:440)
    at org.hibernate.mapping.UnionSubclass.validate(UnionSubclass.java:40)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1108)
我猜这是因为我试图映射到一个基本类,但是@ElementCollection注释不应该解决这个问题吗

我的item类如下所示:

package com.cabesoft.domain.model;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

import com.cabesoft.domain.utils.Money;

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {

    private Integer id;

    private String name;

    private String description;

    private Integer requiredLevel;

    private Money price;

    public Item() {

    }

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name = "oid")
    public Integer getId() {
        return id;
    }

    @Column(name = "name", nullable = false)
    public String getName() {
        return name;
    }

    @Column(name = "description", nullable = false)
    public String getDescription() {
        return description;
    }

    @Column(name = "required_level", nullable = false)
    public Integer getRequiredLevel() {
        return requiredLevel;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setRequiredLevel(Integer requiredLevel) {
        this.requiredLevel = requiredLevel;
    }

    @Embedded
    public Money getPrice() {
        return price;
    }

    public void setPrice(Money price) {
        this.price = price;
    }

}

因为已经尝试了正确的映射,所以很明显,
@ElementCollection
注释没有被使用
@ElementCollection
是在JPA2中引入的

JPA 2 API存在,实现可能仍然缺失。较旧的Hibernate版本不是JPA2实现。如果首选3.X,那么最新版本(3.6.10)值得一试


如果更新Hibernate版本不是一个选项,那么可以使用。

从枚举中删除@Embeddeble注释,并告诉我们它是否更好。不,这不起作用,得到了相同的错误。同时删除ElementCollection的@MapKeyClass注释和targetClass属性。并添加MapKeyEnumerated注释,以指定映射的键必须存储为字符串还是序号。我按照您所说的操作,我的类的结尾如下:@ElementCollection@MapKeyEnumerated(EnumType.string)public map getStats(){return stats;}和我的社会统计类:public enum SocialStat{HAPPINESS}还是有同样的错误?它解决了问题吗?
package com.cabesoft.domain.model;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

import com.cabesoft.domain.utils.Money;

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {

    private Integer id;

    private String name;

    private String description;

    private Integer requiredLevel;

    private Money price;

    public Item() {

    }

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name = "oid")
    public Integer getId() {
        return id;
    }

    @Column(name = "name", nullable = false)
    public String getName() {
        return name;
    }

    @Column(name = "description", nullable = false)
    public String getDescription() {
        return description;
    }

    @Column(name = "required_level", nullable = false)
    public Integer getRequiredLevel() {
        return requiredLevel;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setRequiredLevel(Integer requiredLevel) {
        this.requiredLevel = requiredLevel;
    }

    @Embedded
    public Money getPrice() {
        return price;
    }

    public void setPrice(Money price) {
        this.price = price;
    }

}