本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
Debug 笔记 <AccessType.FIELD,AccessType.PROPERTY和@Access的用途是什么?>
提问
我只想知道所有这些注释之间的区别。我们为什么使用这些?
意味着它们没有任何作用,特别是在字段级别和属性级别上。
像这样使用混合级别注释的目的是什么:
@Entity
@Access(AccessType.FIELD)
class Employee {
// why their is a field level access
private int id;
// whats the purpose of transient here
@Transient
private String phnnumber;
// why its a property level access
@Access(AccessType.property)
public String getPhnnumber() {
return "1234556";
}
}
到底怎么理解?
回答一:
默认情况下,访问类型由放置标识符注释(@Id)的位置定义。
如果您将其放在字段上-将会是AccessType.FIELD,如果您将其放置在getter上-将会是AccessType.PROPERTY。
有时,您可能不希望对字段进行注释,而要对属性进行注释(例如,因为您希望在getter中具有一些任意逻辑,或者因为您更喜欢这种方式。)在这种情况下,您必须定义一个getter并将其注释为AccessType.PROPERTY。
据我所记得,如果您指定任何一个实体字段/方法AccessType.FIELD或AccessType.PROPERTY在任何实体字段/方法上指定,则必须指定整个类的默认行为。
这就是为什么您需要AccessType.FIELD在类级别上进行设置(尽管这AccessType.FIELD是默认值)。
现在,如果你不会有@Transient对phnnumber领域,JPA会为您提供3列的表:
- ID,
- phnnumber,
- getphnnumber。
这是因为它将AccessType.FIELD用于所有实体字段(id和phnnumber),并且同时将其AccessType.PROPERTY用于getter(getPhnnumber())。
您将在数据库中将phone number映射两次。
因此,@Transient注释是必需的-这意味着实体不会将字段的值存储在基础存储中,而是将您的getter返回的值存储在基础存储中。
文章翻译自Stack Overflow :stackoverflow.com/questions/1…