AccessType.FIELD,AccessType.PROPERTY和@Access的目的是什么

时间:2012-12-14 07:40:35

标签: java jpa-2.0 transient

我只是想知道所有这些注释之间的区别。我们为什么要使用这些...意味着它们没有影响,尤其是字段级别和属性级别。

使用混合级注释的目的是什么:

@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";
    }

}

这门课究竟是什么意思?

1 个答案:

答案 0 :(得分:68)

默认情况下,访问类型由您放置标识符注释的位置(@Id)定义。如果你把它放在字段上 - 它将是AccessType.FIELD,如果你把它放在吸气剂上 - 它将是AccessType.PROPERTY

有时您可能想要注释不是字段而是属性(例如,因为您希望在getter中有一些任意逻辑,或者因为您喜欢这种方式。)在这种情况下,您必须定义一个getter并将其注释为{{1 }}

据我记忆,如果您在任何实体字段/方法上指定AccessType.PROPERTYAccessType.FIELD,则必须指定整个类的默认行为。这就是为什么你需要在类级别上AccessType.PROPERTY(尽管AccessType.FIELD是默认值。)

现在,如果您在AccessType.FIELD字段上没有@Transient,则JPA会为您提供3列表格:

  • id,
  • phnnumber,
  • getphnnumber。

那是因为它会将phnnumber用于所有实体字段(AccessType.FIELDid),同时,它会使用phnnumber为您提供getter(AccessType.PROPERTY)。
您将以数据库中两次映射的电话号码结束。

因此,getPhnnumber()注释是必需的 - 这意味着实体不会将字段的值存储在基础存储中,而是 getter返回的值