当前位置: 首页 > 知识库问答 >
问题:

Hibernate映射映射

权烨磊
2023-03-14

我正在使用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;
    }

}

我的Social alStat类是:

@Embeddable
public enum SocialStat {
    HAPPINESS

}

我得到了这个错误:

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;
    }

}

共有1个答案

纪枫
2023-03-14

因为已经尝试了正确的映射,所以很明显没有使用ElementCollection注释<代码>@ElementCollection是在JPA 2中引入的。

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

如果不选择更新Hibernate版本,则可以使用@CollectionOfElements。

 类似资料:
  • 下列的 XML 映射应该是很直白的。例如: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hib

  • 问题内容: 我需要预先将未实现接口的枚举映射到现有数据库,该数据库使用将该枚举存储在与所有者类相同的表中。 在这种情况下应如何处理映射?持久化到数据库不会改变,因为实现该接口的所有枚举都将具有不同的值,但是我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试实例化一个使用指定的enum类进行枚举吗?Hibernate本身是否支持此功能?)。 问题答案: 可以创建一个自定义(例如thi

  • 问题内容: Hibernate提供的注释支持使用或的两种类型的映射。当我们使用映射时,它使用的“名称” 而不是Enum的表示形式。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举: 当我坚持枚举使用,即hibernate尝试在数据库中存储的值是开放的。但是,我的数据库列仅包含一个字符,因此会引发异常。 克服这个问题的一个办法是改变枚举类型持有单个字符(如,代替,)。但是,这降低了

  • 问题内容: 我的问题围绕着我想用JPA映射的以下结构: 我的POJO非常简单(没有复合类型等,只有一些原语)。 如何在链接的问题中实施建议?我该如何仅用部分进行注释(当我仅对字段进行注释时,会发生类转换错误,因为HashMap无法转换为Blob,这是问题的根源- 我不能仅对值部分进行注释地图)? 我不确定是否需要使包装类型实现实现可包装List的Serializable,还是仅使用ArrayLis

  • 问题内容: 我有一个存储过程,该过程返回数据库中数据类型为datetime2以及Java文件中Date为数据的列。当我尝试在从数据库获取的时间上调用getTime()时。它返回的19994321211毫秒等于IST 2015年5月4日星期一。理想情况下,它应该返回2015-05-04 15:21:52的毫秒,因为这是直接执行过程时数据库中显示的时间。 由于我是Hibernate的新手,所以我无法理

  • 主要内容:关联映射,反转,级联在前面的学习中,我们所涉及的都是基于单表的操作,但在实际的开发过程中,基本上都是同时对多张表的操作,且这些表都存在一定的关联关系。 Hibernate 是一款基于 ORM 设计思想的框架,它将关系型数据库中的表与我们 Java 实体类进行映射,表中的记录对应实体类的对象,而表中的字段对应着实体类中的属性。Hibernate 进行增删改查等操作时,不再直接操作数据库表,而是对与之对应的实体类对象进行