Hibernate访问策略是通过对主键属性或其getter方法进行@Id注解来隐式指定的。所以根据@Id访问策略,它将被应用到所有的属性(或字段)上。
是否可以在实体对象上设置FIELD访问,而在@Id属性上只设置属性访问?应该如何配置?
根据hibernate 文件:
缺省的访问策略机制可以通过JPA覆盖。
@Access
注释。
并根据JPA规范。
2.3.2显式访问类型
一个单独的实体类、映射的超类或可嵌入类的访问类型,可以为该类指定,独立于实体层次结构的默认值,通过
Access
注解应用于该类。这种显式访问类型规范不影响实体层次结构中其他实体类或映射的超类的访问类型。以下规则适用。
- 当
Access(FIELD)
应用于实体类、映射的超类或可嵌入类,映射注解可以放在该类的实例变量上,持久化提供者运行时通过该类定义的实例变量访问持久化状态。所有没有使用瞬态注解的非瞬态实例变量都是持久化的。当Access(FIELD)
应用于这样的类,可以有选择地指定类中的单个属性进行属性访问。要指定一个持久化提供者运行时访问的持久化属性,这个属性必须被指定为Access(PROPERTY)
. 如果映射注解被放置在由类定义的任何属性上,那么该行为就没有被定义,因为Access(PROPERTY)
未指定。从超类继承的持久化状态按照这些超类的访问类型被访问。...
所以,你可以做这样的事情。
@Entity(name = "Book")
@Access(AccessType.FIELD)
public static class Book {
// ...
@Id
@Access(AccessType.PROPERTY)
public Long getId() {
return id;
}
// ...
}