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,只是它与“name”同名,因此要区分超类中的字段,必须像super.name在子类中一样引用它。

这样做通常被认为是“错误”(或无论如何都是潜在的错误),最佳实践是不要隐藏字段,因为很容易在不知情的情况下引用错误的字段。

于 2013-06-26T11:56:07.637 回答
1

迟到的答案,但我认为覆盖 getter 方法是一种可靠的方法。

这可以是所有具有 id 字段的表的超类。如果将此对象序列化为 JSON,则 id 将始终出现。

@MappedSuperclass
class ModelEntity {

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

但是,假设您有以下对象(表)Person,并且OccupationwherePersonOccupation.

@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

不 - 您将获得两个不同的字段。中的注释名称字段Employee将隐藏Person类中的名称字段。Person.name不会被注释。

于 2013-06-26T11:57:49.067 回答