65

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

使用混合级别注释的目的是什么,例如:

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

}

这门课到底说了什么?

4

1 回答 1

91

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

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

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

现在,如果您没有@Transientphnnumber现场,JPA 将为您提供一个 3 列的表:

  • ID,
  • 电话号码,
  • 获取phn号码。

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

因此,@Transient注释是必需的——这意味着实体不会将字段的值存储在底层存储中,而是存储getter返回的值。

于 2012-12-14T08:16:18.490 回答