2017-07-14 14 views
1

を使用して、私は、次の2つのクラスしている:私はDateTimeIsBetweenCriteriaクラスのインスタンスを保存しようとしたとき、私はこの例外をHibernateは結合していないタイプと明示的なターゲットエンティティジェネリック

@Entity 
@Table(name = "criteria") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = AbstractCriteria.TYPE, discriminatorType = DiscriminatorType.STRING) 
public abstract class AbstractCriteria<T> implements Serializable { 

    public static final String TYPE = "type"; 

    ... 
    @Column(name = "clazz") private Class<T> clazz; 
    ... 

    protected AbstractCriteria(Class<T> clazz) { 
     this.clazz = Preconditions.checkNotNull(clazz); 
    } 
    ... 

    public abstract Predicate<T> evaluate(T value); 
} 

@Entity 
@DiscriminatorValue(CriteriaType.Values.DATETIME_IS_BETWEEN) 
public class DateTimeIsBetweenCriteria extends AbstractCriteria<DateTime> { 
    ... 
    public DateTimeIsBetweenCriteria() { 
     super(DateTime.class); 
    } 
    ... 


    @Override 
    public Predicate<DateTime> evaluate(DateTime value) { 
     ... 
    } 
} 

ました:

Exception in thread "main" org.hibernate.AnnotationException: 
Property ...AbstractCriteria.clazz has an unbound type and no explicit target entity. 
Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type 

私はTHIだった私はAbstractCriteriaにメソッドのclazzを必要とし、T等の文字列、DateTimeの、ブール、

することができclazz@Transientを作成していますが、私はそれでも、データベースから基準を読み込むときに、どの基準を使用しているかを知るために、保存する基準を特定する別の列が必要です。私はこれがちょっとハッキリだと思う。

私のデザインを変更することなくその例外を解決する方法はありますか?

多くのことに感謝します。

答えて

0

私はパラメータ化された型を使用していないために私の実装を変更している:あなたの答えのための

@Entity 
@Table(name = "criteria") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = AbstractCriteria.TYPE, discriminatorType = DiscriminatorType.STRING) 
public abstract class AbstractCriteria implements Serializable { 

    public static final String TYPE = "type"; 

    ... 
    @Column(name = "clazz") private Class clazz; 
    ... 

    protected AbstractCriteria(Class clazz) { 
    this.clazz = Preconditions.checkNotNull(clazz); 
    } 
    ... 

    public abstract Predicate evaluate(Object value); 
} 

@Entity 
@DiscriminatorValue(CriteriaType.Values.DATETIME_IS_BETWEEN) 
public class DateTimeIsBetweenCriteria extends AbstractCriteria { 
    ... 
    public DateTimeIsBetweenCriteria() { 
    super(DateTime.class); 
    } 
    ... 


    @Override 
    public Predicate evaluate(Object value) { 
    if (value instanceof DateTime) { 
     // do evaluation and return here. 
    } else { 
     throw new UserDefinedException("..."); 
    } 
    } 
} 
0

あなたは正しい行ですが、タイプ "クラス"のクラスを永続化しようとしています。データベースには直接マッピングできるデータ型がありません(したがってあなたのエラー)、私が考えることができるのはクラス名に文字列を使うことです。

@Column (name="className") 
private String classname; 

とクラスを取得するには

.... setClassname (DateTime.getCanonicalName()); 

で設定します。

Class.forName(classname); 

しかし、私はあなたが何をしているかについての正しい考えを持っている場合は、あなたがすべてでクラスを永続化する必要はありません。すべてのDateTimeIsBetweenCriteriaインスタンスのDateTimeを操作して - それは、クラスのテンプレートパラメータです、インスタンスではありません。クラスの振る舞いではなく、日付間を持続させる必要があります。

+1

感謝を。しかし、データベースにクラスを保持できないのは間違いです。 'clazz'カラムをvarcharとして宣言し、hibernateがクラスを保存することをサポートすることができます。 – Budzu

+0

私は修正されました。これは私が遭遇したことではありません - ありがとう!答えの最後の部分は有用ですか? – GrumpyWelshGit

+0

私は上記のように 'clazz'を保存する必要はありません。いくつかの計算に 'clazz'値を使う必要があります。私がそれを保存しない(一時的にする)と、休止状態で基準を読み込むと、 'clazz'がnullになります。 – Budzu

関連する問題