1

この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ファイルです

4

2 に答える 2

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ます。申し訳ありませんが、表示されたコードからは推測できませんでした。明らかだと思いました。

于 2010-04-09T23:14:08.087 に答える
0

ケビン・クロウェルと同じコメント。エンティティ型に内部クラスを使用しないことも検討してください。私は実際に誰かが Hibernate でそれを行うのを見たことがないので、それが可能かどうか、またはどのようにマッピングするかはわかりません。

BusinessDate 内部クラスの @Inheritance アノテーションも少し怪しいようです。内部クラスは静的であり、Hibernate が内部クラスを「継承」として扱わない限り、別のエンティティから継承しません。

全体として、何を達成しようとしているのかよくわかりませんが、必要以上に人生を難しくしている可能性があります。内部クラスを使用せず、すべてのエンティティをよりシンプルでわかりやすい方法でマッピングすることをお勧めします。

于 2010-04-09T22:29:26.853 に答える