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

Ash*_*sal 50 java transient jpa-2.0

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

这堂课到底是什么意思?

Pio*_*cki 72

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

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

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

现在,如果您没有@Transientphnnumber字段,JPA将为您提供3列表:

  • ID,
  • phnnumber,
  • getphnnumber.

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

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

  • 默认值不是FIELD.如果在字段上放置映射注释,则访问类型为FIELD;如果在getter上放置映射注释,则为PROPERTY.并且所有实体层次结构必须在映射注释放置中保持一致:始终在字段上,或始终在getter上,但不是混合. (13认同)
  • 如果您没有明确指定访问类型,则JPA规范指出层次结构中的所有映射注释都必须放在字段或getter上.但是,如果您不遵守规则,会发生什么.Hibernate查找Id注释的位置,如果它在字段上,则忽略getter上的所有注释(反之亦然),但这是特定于Hibernate的.在这种情况下的行为是未定义的(这是规范所说的). (3认同)
  • 你是对的 - 默认值取决于 `@Id` 注释所在的位置。关于混合 - 您仅指的是 id 注释还是您根本无法在实体层次结构中混合属性/字段访问的事实? (2认同)