15

次のようなクラスがある場合:

class Person {
  private String name;
  ...constructor, getters, setters, equals, hashcode, tostring...
}

クラスの残りの部分を再実装せずに、サブクラス化してサブクラスの名前フィールドに注釈を適用できますか?たとえば、永続化注釈を適用できますか?

@Entity
class Employee extends Person {
    @Column(...)
    private String name;
}
4

4 に答える 4

16

スーパークラスのフィールドは影響を受けないため、これは機能しませんが、これを試すことができます

@Entity
class Employee extends Person {
  @Column(name="xxx")
  @Override
  public void setName(String name) {
     super.setName(name);
  }
  ...
于 2013-06-26T11:57:37.843 に答える
14

いいえ、できません。

あなたが提案しているのは、フィールドのシャドーイングです - フィールドをオーバーライドすることはできません。

サブクラスのフィールドは、スーパー クラスnameのフィールドとは何の関係もありませんが、「名前」という同じ名前を共有しているため、スーパー クラスのフィールドを区別するには、サブクラスのnameように参照する必要があります。super.name

これを行うことは一般に「バグ」(または潜在的なバグ) と見なされます。ベスト プラクティスは、フィールドをシャドウしないことです。

于 2013-06-26T11:56:07.637 に答える
1

遅い答えですが、ゲッターメソッドをオーバーライドすることは堅実なアプローチだと思います。

これは、id フィールドを持つすべてのテーブルのスーパークラスになることができます。このオブジェクトを JSON にシリアル化すると、ID が常に表示されます。

@MappedSuperclass
class ModelEntity {

    @Id
    @Column(
        name      = "id",
        updatable = false,
        nullable  = false
    )
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long id
}

しかし、次のオブジェクト (テーブル)がPersonあり、OccupationwherePersonと 1 対多の関係があるとしOccupationます。

@Entity
@Table(name = "occupation")
Occupation extends ModelEntity {

    @Column
    String company

    @Column 
    String position
}

@Entity
@Table(name = "person")
Person extends ModelEntity {

    @Column
    String name

    @OneToMany
    Occupation occupation
}

ModelEntityオブジェクトをシリアル化する場合に拡張するすべてのクラスに id が存在する場合、次のPersonようになります。

{
    "id" : 1,
    "name" : "Jordan",

    "occupation" : {
        "id" : 1,
        "company" : "WalMart",
        "position" : "Engineer"
    }

}

id をオブジェクトに表示したくないOccupationが、オブジェクトに表示したい場合は、クラス レベルでメソッドをPerson実装し、必要な注釈を適用できます。getId()Occupation

@Transient
public Long getId() {

    return id;   
}

これで、JSON は次のように表示されます: 実際のデータベースには両方とも id 列があります:

{
    "id" : 1,
    "name" : "Jordan",

    "occupation" : {
        "company" : "WalMart",
        "position" : "Engineer"
    }

}
于 2018-06-09T19:39:11.683 に答える
0

いいえ - 2 つの異なるフィールドが表示されます。の注釈付きの名前フィールドは、クラスEmployeeの名前フィールドを隠します。注釈は付けられません。PersonPerson.name

于 2013-06-26T11:57:49.067 に答える