首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate MappingException

Hibernate MappingException
EN

Stack Overflow用户
提问于 2010-04-09 22:17:43
回答 2查看 2.9K关注 0票数 1

我得到了Hibernate错误:

代码语言:javascript
复制
org.hibernate.MappingException: Could not determine type for: 
a.b.c.Results$BusinessDate, for columns: [org.hibernate.mapping.Column(businessDate)]

这门课在下面。有人知道我为什么会犯这个错误吗?

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "businessDate"
})
@XmlRootElement(name = "Results")
@Entity(name = "Results")
@Table(name = "RESULT")
@Inheritance(strategy = InheritanceType.JOINED)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Results implements Equals, HashCode
{

    @XmlElement(name = "BusinessDate", required = true)
    protected Results.BusinessDate businessDate;

    public Results.BusinessDate getBusinessDate() {
        return businessDate;
    }

    public void setBusinessDate(Results.BusinessDate value) {
        this.businessDate = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "raw",
        "display"
    })
    @Entity(name = "Results$BusinessDate")
    @Table(name = "BUSINESSDATE")
    @Inheritance(strategy = InheritanceType.JOINED)
    public static class BusinessDate implements Equals, HashCode
    {

    ....

更新:此代码由HyperJaxB生成。所以我并不是说我完全理解它,我只是想对它做一些改变!

Update2:这是完整 (耶,它很大) src文件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-09 23:14:08

将静态嵌套类作为字段类型使用,是很好的并受支持。但是Hibernate不知道如何将这样一个复杂的类型映射到列类型(错误消息就是这么说的)。因此,您需要创建一个用户类型来处理这个问题,或者用一个Results.BusinessDate注释对@OneToOne字段进行注释,以便将它保存在另一个表中(我也会删除@Inheritance,这是无用的,但这不是这里的问题)。

更新:只是为了澄清、使用用户类型或将复杂类型与@OneToOne 映射为。以下代码运行良好(经过测试):

代码语言:javascript
复制
@Entity
public class EntityWithStaticNestedClass implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    @OneToOne
    private EntityWithStaticNestedClass.StaticNestedClass nested;

    public Long getId() { return id; }

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

    public EntityWithStaticNestedClass.StaticNestedClass getNested() { 
        return nested;
    }

    public void setNested(EntityWithStaticNestedClass.StaticNestedClass nested) {
        this.nested = nested;
    }

    @Entity
    public static class StaticNestedClass implements Serializable {
        @Id
        @GeneratedValue
        private Long id;

        public Long getId() { return id; }

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

两个实体在各自的表中保持良好。但是您并没有显示整个代码,也没有显示确切的错误,所以我不能解释为什么它没有给您(可能您缺少了@Id等)。

尽管如此,如果您根本不希望businessDate被持久化,可以用@Transient对其进行注释(对于JPA,默认情况下字段是持久的):

更新:无法混合字段和属性访问的。因此,您需要在这里用@Transient注释@Transient。对不起,我无法从显示的代码中猜到这一点,我认为这是显而易见的。

票数 2
EN

Stack Overflow用户

发布于 2010-04-09 22:29:26

和凯文·克洛威尔一样的评论。您还可以考虑不将内部类用于实体类型。实际上,我从来没有见过有人用Hibernate这样做,所以我不确定这是否可能,也不确定您将如何映射它。

BusinessDate内部类上的@Inheritance注释似乎也有点可疑--内部类是静态的,不会从另一个实体继承,除非Hibernate将内部类视为“继承”。

总的来说,不太确定你想要完成什么,但你可能会让你的生活变得比应该的更艰难。我建议不要使用内部类,只需以更简单/直接的方式映射所有实体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2611315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档