1.12 AccessType.FIELD,AccessType.PROPERTY和@Access的用途是什么? | Java Debug 笔记

663 阅读2分钟

本文正在参加「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.FIELDAccessType.PROPERTY在任何实体字段/方法上指定,则必须指定整个类的默认行为。

这就是为什么您需要AccessType.FIELD在类级别上进行设置(尽管这AccessType.FIELD是默认值)。

现在,如果你不会有@Transientphnnumber领域,JPA会为您提供3列的表:

  • ID,
  • phnnumber,
  • getphnnumber。

这是因为它将AccessType.FIELD用于所有实体字段(idphnnumber),并且同时将其AccessType.PROPERTY用于gettergetPhnnumber())。

您将在数据库中将phone number映射两次。

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

文章翻译自Stack Overflow :stackoverflow.com/questions/1…