我收到了这个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 :这是full(是的,它的大)src文件
答案 0 :(得分: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
。对不起,我无法从显示的代码中猜出来,我认为这很明显。
答案 1 :(得分:0)
与Kevin Crowell相同的评论。您可能还会考虑不使用实体类型的内部类。我实际上从来没有见过有人用Hibernate这样做,所以我不确定它是否可能,或者你将如何映射它。
BusinessDate内部类的@Inheritance注释似乎有点可疑 - 内部类是静态的,并且不从其他实体继承,除非Hibernate将内部类视为“继承”。
总的来说,不确定你想要完成什么,但你可能会让你的生活更加艰难。我建议不要使用内部类,只是以更简单/直接的方式映射所有实体。