我只是想知道所有这些注释之间的区别。我们为什么要使用这些...意味着它们没有影响,尤其是字段级别和属性级别。
使用混合级注释的目的是什么:
@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";
}
}
这门课究竟是什么意思?
答案 0 :(得分:68)
默认情况下,访问类型由您放置标识符注释的位置(@Id
)定义。如果你把它放在字段上 - 它将是AccessType.FIELD
,如果你把它放在吸气剂上 - 它将是AccessType.PROPERTY
。
有时您可能想要注释不是字段而是属性(例如,因为您希望在getter中有一些任意逻辑,或者因为您喜欢这种方式。)在这种情况下,您必须定义一个getter并将其注释为{{1 }}
据我记忆,如果您在任何实体字段/方法上指定AccessType.PROPERTY
或AccessType.FIELD
,则必须指定整个类的默认行为。这就是为什么你需要在类级别上AccessType.PROPERTY
(尽管AccessType.FIELD
是默认值。)
现在,如果您在AccessType.FIELD
字段上没有@Transient
,则JPA会为您提供3列表格:
那是因为它会将phnnumber
用于所有实体字段(AccessType.FIELD
和id
),同时,它会使用phnnumber
为您提供getter(AccessType.PROPERTY
)。
您将以数据库中两次映射的电话号码结束。
因此,getPhnnumber()
注释是必需的 - 这意味着实体不会将字段的值存储在基础存储中,而是 getter返回的值强>