Java 我可以注释从超类继承的成员吗?
如果我有以下课程:Java 我可以注释从超类继承的成员吗?,java,inheritance,annotations,Java,Inheritance,Annotations,如果我有以下课程: class Person { private String name; ...constructor, getters, setters, equals, hashcode, tostring... } 我是否可以对子类中的name字段进行子类化并应用注释,例如应用持久性注释,而无需重新实现类的其余部分 @Entity class Employee extends Person { @Column(...) private String name;
class Person {
private String name;
...constructor, getters, setters, equals, hashcode, tostring...
}
我是否可以对子类中的name字段进行子类化并应用注释,例如应用持久性注释,而无需重新实现类的其余部分
@Entity
class Employee extends Person {
@Column(...)
private String name;
}
不,你不能
您建议的是字段阴影-您不能覆盖字段
子类中的字段name
与超类中的字段name
没有任何关系,只是它与“name”同名,因此为了区分超类中的字段,必须在子类中将其称为super.name
这样做通常被认为是一个“bug”(或者是一个潜在的bug),最好的做法是不要对字段进行阴影处理,因为在不知道的情况下很容易引用错误的字段。这是行不通的,因为超类中的字段不会受到影响,但您可以尝试这样做
@Entity
class Employee extends Person {
@Column(name="xxx")
@Override
public void setName(String name) {
super.setName(name);
}
...
否-您将得到两个不同的字段。
Employee
中带注释的名称字段将隐藏Person
类中的名称字段Person.name
将不会被注释。延迟回答,但我认为覆盖getter方法是一种可靠的方法
这可以是具有id字段的所有表的超类。如果将此对象序列化为JSON,则id将始终显示
@MappedSuperclass
class ModelEntity {
@Id
@Column(
name = "id",
updatable = false,
nullable = false
)
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id
}
但是假设您有以下对象(表)Person
和occulation
,其中Person
与occulation
有一对多关系
@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
}
假设id存在于扩展modeleentity
的所有类中,如果要序列化Person
对象,您将得到如下结果:
{
"id" : 1,
"name" : "Jordan",
"occupation" : {
"id" : 1,
"company" : "WalMart",
"position" : "Engineer"
}
}
如果您不希望id显示在occulation
对象中,但确实希望它显示在Person
对象中,则可以在occulation
类级别实现getId()
方法,并应用所需的注释:
@Transient
public Long getId() {
return id;
}
现在,JSON将显示如下:即使它们在实际数据库中都有一个id列:
{
"id" : 1,
"name" : "Jordan",
"occupation" : {
"company" : "WalMart",
"position" : "Engineer"
}
}
您可以重写getter/setter并将
@列放在那里。对于重写的(@override
)getter方法,这也很有效,而且更清楚。我认为您没有抓住要点。问题是对在超类中定义的成员进行注释,而不是对其进行阴影处理。@david问题是希望通过“覆盖”该字段来向超类字段添加注释,但您不能这样做;OP已经遮蔽了超类场,它没有超类场的效果。不能从子类中注释超类的成员。