1

すべてのモデル クラスに静的な Finder を追加することにうんざりしています。

これができないのはなぜですか:

@MappedSuperclass
public class MyModel<T> extends Model {

    public static Finder<Integer,T> FIND = new Finder<Integer, T>(Integer.class,T.class);

}

@SuppressWarnings("serial")
@Entity
public class ValidationScript extends MyModel<ValidationScript> {

    @Id
    public Integer id;

    @Column(length = 5000)
    public String scriptCode;

}
4

2 に答える 2

1

同じ問題があるので、解決策を探すのに少し時間を費やしましたが、これはPlay/Ebeanに関連する問題ではありません。

残念ながら、Javaではこれを行うことはできません。設計上、静的フィールドはすべてのsuclass(同じオブジェクト!)によって共有されます。そしてもちろん、複数のタイプのオブジェクトを持つことはできません!ジェネリックスは、コンパイル時にメソッド呼び出しの正確さをチェックするために使用されます:http: //docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

ジェネリックスを使用して提案したソリューションは、静的フィールド/メソッドが型にアクセスできないため機能しません(すべてのインスタンスが異なる型を持っている可能性があります)。

あなたの場合、フィールドFINDMyModelのすべてのサブクラスで共有されます。


静的メソッドfinder()でフィールドを変換し、静的ハッシュマップクラス/ファインダーを使用して「ファインダープール」を作成しようとしましたが、呼び出し元は常にであるため、とにかくこのMyModel.finder(ValidationScript.class)のようなクラスを提供する必要がありますスーパークラス。

冗長すぎる...

于 2013-03-09T23:50:34.193 に答える
1

テンプレートはとても簡単です。@Idフィールドを手動で追加する代わりに、このテンプレートを使用してくださいFinder

@javax.persistence.Id
public $ID$ id;

public static Finder<$ID$, $CL$> find
        = new Finder<$ID$, $CL$>($ID$.class, $CL$.class);

テンプレートのエディターに貼り付けた後、クリックEdit variablesして式を設定CLしますclassName()

スクリーンショットを見てください

Finder のライブ テンプレート

ライブ テンプレート変数

于 2013-03-12T04:22:49.593 に答える