如果我有一个类如:
class Person {
private String name;
...constructor, getters, setters, equals, hashcode, tostring...
}
我可以将子类子类化并应用于子类中的name字段,例如应用持久性注释,而无需重新实现类的其余部分吗?
@Entity
class Employee extends Person {
@Column(...)
private String name;
}
答案 0 :(得分:14)
由于超类中的字段不会受到影响,因此无法正常工作,但您可以尝试这个
@Entity
class Employee extends Person {
@Column(name="xxx")
@Override
public void setName(String name) {
super.setName(name);
}
...
答案 1 :(得分:9)
不,你不能。
您提议的是字段阴影 - 您无法覆盖字段。
子类中的字段name
与超类中的字段name
没有任何关系,除了它共享“name”的相同名称,从而区分字段中的字段超类,必须在子类中将其称为super.name
。
这样做通常被认为是一个“错误”(或者可能是一个潜在的错误),最佳实践是不影响字段,因为在不知情的情况下很容易引用错误的字段。
答案 2 :(得分:1)
迟到的答案,但我认为重写getter方法是一种可靠的方法。
这可以是具有id字段的所有表的超类。如果将此对象序列化为JSON,则始终显示id。
@MappedSuperclass
class ModelEntity {
@Id
@Column(
name = "id",
updatable = false,
nullable = false
)
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id
}
但是,让我们说你有以下对象(表格)Person
和Occupation
,其中Person
与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
对象,那么扩展Person
的所有类中都会出现id,你会得到类似的结果:
{
"id" : 1,
"name" : "Jordan",
"occupation" : {
"id" : 1,
"company" : "WalMart",
"position" : "Engineer"
}
}
如果您不希望ID显示在Occupation
对象中,但您确实希望它显示在Person
对象中,则可以在getId()
方法中实现Occupation
方法@Transient
public Long getId() {
return id;
}
班级,并应用所需的注释:
{
"id" : 1,
"name" : "Jordan",
"occupation" : {
"company" : "WalMart",
"position" : "Engineer"
}
}
现在您的JSON将如下所示:即使它们在实际数据库中都有一个id列:
videoView.contentOverlayView?.layer?.setNeedsDisplay()
答案 3 :(得分:0)
不 - 你会得到两个不同的领域。 Employee
中带注释的名称字段将隐藏Person
类中的名称字段。 Person.name
将不会被注释。