Java AccessType.FIELD、AccessType.PROPERTY和@Access的用途是什么

Java AccessType.FIELD、AccessType.PROPERTY和@Access的用途是什么,java,jpa-2.0,transient,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

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

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

@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
)定义。如果你把它放在球场上,它将会是,如果你把它放在getter上,它将会是

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

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

现在,如果在
phnnumber
字段上没有
@Transient
,JPA将为您提供一个3列表格:

  • 身份证
  • phnnumber
  • getphnnumber
这是因为它将对所有实体字段(
id
phnnumber
)使用
AccessType.FIELD
),同时,它将对getter(
getPhnnumber()
)使用
AccessType.PROPERTY

您将在数据库中以两次映射的电话号码结束


因此,需要
@Transient
注释-这意味着实体不会将字段的值存储在基础存储中,但由getter返回的值默认不是字段。如果在字段上放置映射注释,则访问类型为FIELD;如果在getter上放置映射注释,则访问类型为PROPERTY。所有实体层次结构在映射注释位置中必须一致:始终在字段上,或始终在getter上,但不能混合。你说得对-默认值取决于
@Id
注释的位置。关于混合-您指的只是id注释,或者您根本不能在实体层次结构中混合属性/字段访问?如果您没有明确指定访问类型,JPA规范规定层次结构中的所有映射注释必须放在字段或getter上。但是,如果您不遵守规则,会发生什么情况并没有指定。Hibernate查找Id注释所在的位置,如果它位于字段上,则忽略getter上的所有注释(反之亦然),但这是特定于Hibernate的。这种情况下的行为是未定义的(规范中是这么说的)。我可以发誓我读过“Pro JPA 2.0:掌握Java持久性”中的
@Id
,但我只是检查了规范,它实际上根本没有提到Id;只是关于映射您提到的注释。谢谢你的澄清!好的,我刚刚在书中发现它是
@Id
,因为它是示例中唯一的映射注释…另请参见优秀的比较讨论: