Hibernate MappingException - PullRequest
       13

Hibernate MappingException

1 голос
/ 10 апреля 2010

Я получаю эту ошибку Hibernate:

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 . Так что я не претендую на понимание всего этого, просто пытаюсь внести в него некоторые изменения!


Обновление2 : Вот полный (да, это большой) файл src

Ответы [ 2 ]

2 голосов
/ 10 апреля 2010

Использование статического вложенного класса в качестве типа поля хорошо и поддерживается. Но 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 здесь. Извините, я не мог догадаться, что из показанного кода, и я думал, что это будет очевидно.

0 голосов
/ 10 апреля 2010

Тот же комментарий, что и у Кевина Кроуэлл. Вы также можете посмотреть не использовать внутренние классы для типов сущностей. На самом деле я никогда не видел, чтобы кто-то делал это с Hibernate, поэтому я не уверен, возможно ли это вообще, или как вы бы это отобразили.

Аннотация @Inheritance к внутреннему классу BusinessDate также выглядит несколько странно - внутренний класс является статическим и не наследуется от другого объекта, если только Hibernate не обрабатывает внутренние классы как «унаследованные».

В целом, не совсем уверен, что вы пытаетесь достичь, но вы можете сделать свою жизнь сложнее, чем следовало бы. Я бы порекомендовал не использовать внутренние классы, а просто отобразить все сущности более простым / простым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...