【问题标题】:Hibernate access strategy for @Id property@Id 属性的休眠访问策略
【发布时间】:2020-10-05 15:24:36
【问题描述】:

Hibernate 访问策略是通过使用 @Id 注释来注释主键属性或其 getter 方法来隐式指定的。因此,根据@Id 访问策略,它适用于所有属性(或字段)。

是否可以在实体对象上设置 FIELD 访问但仅在 @Id 属性上设置属性访问?应该如何配置?

【问题讨论】:

    标签: hibernate annotations


    【解决方案1】:

    根据休眠documentation

    可以使用 JPA @Access 注解覆盖默认访问策略机制。

    并且根据 JPA 规范:

    2.3.2 显式访问类型

    可以通过Access 注解为该类指定独立于实体层次结构的默认值的单个实体类、映射超类或可嵌入类的访问类型 应用于班级。此显式访问类型规范不影响实体层次结构中其他实体类或映射超类的访问类型。以下规则适用:

    • Access(FIELD)应用于实体类、映射超类或可嵌入类时,可以在该类的实例变量上放置映射注解,持久化提供程序运行时通过该类定义的实例变量访问持久状态.未使用 Transient 注解进行注解的所有非瞬态实例变量 是持久的。 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;
        }
    
        // ...
    }
    

    【讨论】:

    • 谢谢!但是在文档中的示例中,您指出对象级别的访问策略是由@Id 注释设置的。并在现场级别被覆盖。如果我们将@Access(AccessType.FIELD) 放在对象级别,它会比@Id 注释具有更高的优先级吗?
    • @Alterant 我已经通过添加来自 JPA 规范的确认来更新我的答案。但老实说,我没有测试它。
    • 谢谢!感谢您的帮助!
    猜你喜欢
    • 2015-01-12
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多