2010-11-22 10 views
3

私のアプリケーションクラスは、デフォルトの2つの変数を持つライブラリを使用しています。スーパークラスから変数を省略する方法はありますか?

// A class from framework: 

public class SuperClass implements Serializable { 

    private long id; 
    private long version; 

    // getter and setter methods for these variables... 

} 

フレームワークの機能のいくつかにアクセスするには、このクラスを拡張する必要があります。

私はこのような自分のクラスにこのクラスを拡張する場合は、次のプログラミングモデルを1として

public class MyClassChild extends SuperClass { 

    private long myprimarykey; 
    private String some column; 
    private long myversion; 

    // getter and setter methods for these variables... 

} 

、これら二つの変数にもアクセス可能です。 タイプSuperClassのオブジェクトを必要とする操作を実装している間。

2つの変数(id, version)を含まないSuperClassを拡張する考えはありますか?

どうすればいいですか?

提案がありますか?

ありがとう

+2

どのようにそれらの変数は、あなたの子クラスで表示されますか?それらは保護されていないプライベートであると宣言されます。 –

+2

これをHibernateやJPAのようなORMフレームワークで使用していると思いますか?あなたがそれらの変数を見ることができる唯一の方法は、反映を介してです。それらの変数をあなたのサブクラスで永続させたくないということだけですか? –

+0

まったく男。これらの2つの変数を維持しないでください。 –

答えて

1

あなたが属性を削除するには、スーパークラスのマッピングをオーバーライドすることはできませんが、あなたのプロバイダに応じて、次の操作を行うことも可能である。また

public class MyClassChild extends SuperClass { 

    private long myprimarykey; 
    private String some column; 
    private long myversion; 

    // Override superclass mappings 
    @Transient 
    long getId() { return super.getId(); } 
    @Transient 
    void setId(long id) { return super.setId(long id); } 
    // etc... 
} 

EDIT

、それを@AttributeOverrideアノテーションを使用して、マップされたスーパークラスの個々の列の値をオーバーライドすることもできます。

@AttributeOverride(name="id", [email protected](name="EMP_ID")) 
@Entity 
public class MyClassChild extends SuperClass { 

    private String some column; 
    ... 
} 
+0

私の問題は変数名です。私はIDとして 'Id'を、バージョンとして 'version'を持つことを望んでいません。つまり、他の名前を付けたいと思っています。 –

+0

テーブルの列名、またはクラスの実際のメソッド名、あるいはその両方を意味しますか? –

+0

'select、insert or anything'の操作を実行すると、データベーステーブルにあると予想される2つの変数 'id'と 'version'があります。しかし、persistence.xmlでこれを ''を追加すると、これらの2つの変数が直接マッピングされてデータベーステーブルの列が作成されます。私がしたかったのは、 "ID"ではなく "EMP_ID"のように私の主キーを使用していて、 "バージョン"は大きな問題ではないということです。 –

1

いいえ。あなたが継承しているならば、クラス全体が来るようになります。すべてのフィールドを継承したくない場合は、サブクラスを設計していません。

変数を省略することができたらどうなるか想像してみましょう。すべてが壊れるでしょう...

+0

このような操作はできませんか? –

+0

いいえ、それは達成できません。 – dteoh

1

あなたができることは、その変数をスーパークラスに対してプライベートにすることです。サブクラスはその変数を「認識」しません。

0

変数とメソッドを追加していると思われるクラスを拡張すると、引き算することはできません。

3

これらのフィールドを削除することはできませんが、ゲッターとセッターをデフォルトよりも優先させることができます(アクセス修飾子によって異なりますが、おそらくprotected以上)。このようにして、たとえば、これらの変数の外部割当を停止することができます。このルートを選択した場合は、ノックオンの動作を予測できるように、これらのフィールドがスーパークラスで使用される方法を理解しておくことをお勧めします。一般JPAに

関連する問題