我收到此休眠错误:

org.hibernate.MappingException: Could not determine type for:
a.b.c.Results$BusinessDate, for columns: [org.hibernate.mapping.Column(businessDate)]


班级在下面。有谁知道为什么我会收到此错误?

@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:这是full(是的,很大)src文件

最佳答案

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

更新:只是为了澄清,使用用户类型或使用@OneToOne映射复杂类型确实可行。以下代码可以完美运行(经过测试):

@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,默认情况下字段是持久的):

更新:您不能混合使用字段和属性访问。因此,您需要在此处用getBusinessDate()注释@Transient。抱歉,从显示的代码中我无法猜到,我认为这很明显。

关于java - hibernate MappingException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2611315/

10-11 20:49