2

既存の Java ORM (Ebean) に対する Scala 拡張機能を開発しています。このプロジェクトの目標は、ORM にできるだけ多くのタイプ セーフを追加することです。それ以外の

Ebean.find(Product.class).fetch("name", "unit").findList()

私は最終的に次のようなものを書くことができるようにしたいと思います

(objects of entity[Product] with attributes name and unit) getIt

(これは非常に最初の DSL アプローチであることに注意してください)。

ORM モデルはすでに次のように定義されています。

@Entity
public class {
    public String name;
    public String unit;
}

コンパイル時にクエリ内の属性のタイプ セーフを実現するには、たとえば のようなダミー オブジェクトでそれらにアクセスする必要があります(new Product()).name

これは、そのクラスに存在するモデル メンバーのみが使用されるようにするための最良の方法だと思いますが、実行時に、この変数がアクセスされたことを認識する方法が必要です。それ以外の場合は、そのメンバーを呼び出すだけnameで、クエリでこれについて知りません。

これを達成する方法を知っている人はいますか?変数がいつアクセスされたかを追跡し、実行時にその情報を他のオブジェクトに与える可能性はありますか?

モデル クラスで public メンバーを使用する代わりに、getter と setter にフックすることは既に考えていましたが、これではクエリまたはモデルが非常に見苦しくなります。もう 1 つの問題は、追加の特定のメソッドをモデルごとに手動で追加する必要があることです。

誰かが可能な解決策を提案できれば幸いです。ありがとう!

4

2 に答える 2

1

モデル オブジェクトのフィールドをレコード フィールドのようなものとして定義する場合は、Emil が提案したものが機能する可能性がありますが、カスタム タイプを使用して Java ORM の上にソリューションを構築している場合は問題になる可能性があります。フィールド アクセスを追跡する必要がある場合は、 CGLibJavassistなどのライブラリを使用したランタイム バイトコード インストルメンテーションが最適だと思います。インストルメント化された「ダミー」オブジェクトを関数の本体に渡し、スレッド ローカルでアクセスされたフィールドを追跡できます。それがSquerylでのやり方です。

于 2012-06-07T15:59:54.713 に答える
0

Lift の人々がどのようにMapperと Records を実装したかを垣間見ることができます。コンパニオン オブジェクトを使用した (生の SQL を使用した場合と同様に) タイプ セーフなクエリが可能です。モデルに特性を継承する必要があり、フィールドは通常の値ではなくオブジェクトとして指定されます。役に立つかもしれませんが。永続化のソースはこちらにあります

于 2012-06-06T18:49:46.347 に答える