Hibernate MappingException
Я получаю эту ошибку 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. Так что я не претендую на понимание всего этого, просто пытаюсь внести в него некоторые изменения!
Update2: вот полный (да, это большой) файл SRC
2 ответа
Использование статического вложенного класса в качестве типа поля прекрасно и поддерживается. Но 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
Вот. Извините, я не мог догадаться, что из показанного кода, и я думал, что это будет очевидно.
Тот же комментарий, что и у Кевина Кроуэлл. Вы также можете посмотреть не использовать внутренние классы для типов сущностей. На самом деле я никогда не видел, чтобы кто-то делал это с Hibernate, поэтому я не уверен, возможно ли это вообще, или как бы вы это отобразили.
Аннотация @Inheritance к внутреннему классу BusinessDate также выглядит немного странной - внутренний класс является статическим и не наследуется от другого объекта, если только Hibernate не обрабатывает внутренние классы как "унаследованные".
В целом, не совсем уверен, что вы пытаетесь достичь, но вы можете сделать свою жизнь сложнее, чем следовало бы. Я бы порекомендовал не использовать внутренние классы, а просто отобразить все сущности в более простой / понятной форме.