【问题标题】:JPA - access stratagyJPA - 访问策略
【发布时间】:2016-08-16 06:07:24
【问题描述】:

我想注释我的字段,因为 getter 和 setter 大部分时间是由 IDE 生成的。 当我用@Id 注释标识符字段时,实体的访问策略变为基于字段的。但是,我不想在调用getId() 时出现延迟初始化异常,以防实体被延迟加载。

我想对字段进行注释,但我也想拥有基于属性的访问策略。我该怎么做?

我将@Access(AccessType.PROPERTY) 放在我的实体类之上,但随后我的 JPA 提供程序(即 Hibernate)抛出 org.hibernate.AnnotationException: No identifier specified for entity: ...

【问题讨论】:

  • 请多解释一下为什么需要这个?属性/字段访问定义 JPA 提供程序如何访问您的实体和注释,而不是您的应用程序如何访问,因此它应该与任何延迟初始化问题无关。
  • 您可以发布您的实体或它的样本吗?否则很难猜出您遇到问题的原因。
  • @Chris,休眠通过字段访问它,因为注释在字段之上,但我的其他类调用 getId(),因为 id 通常是私有的。如果实体是延迟加载的,则会导致异常。我想继续注释字段,但能够毫无问题地调用 getId。这仅适用于 id 字段。
  • 对方法进行注释应该对是否加载“id”值没有影响。如果未设置字段访问权限,则不会设置属性访问权限。
  • @Chris,我以同样的方式思考,但我尝试并观察到,如果我注释字段,并在延迟加载的实体上调用 getId,我会得到异常。但是,如果我在 getId 上进行注释,并在同一场景中调用 getId,则不会出现异常。

标签: java hibernate jpa


【解决方案1】:

在实体上指定@Access(AccessType.PROPERTY) 将导致提供者只查看注释和访问实体的属性,因此它应该忽略字段注释。

@Access(AccessType.PROPERTY) 注释也可以用于方法和字段,允许使用不同的东西。在您的情况下,将其保留为默认值,继续向字段添加注释但使用 @Access(AccessType.PROPERTY) 注释标记它们会导致提供者获取注释,但仍使用属性来访问实体上的值.

正如评论中提到的,这不会影响惰性设置。

【讨论】:

    【解决方案2】:

    尝试查看 JPA 缓存功能,这允许您返回一个集合并按 id 或字段查找。使用 AccessType 库,您可以配置特定的实体管理器以延迟或急切地检索。

    http://www.objectdb.com/java/jpa/persistence/cache

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 2011-01-17
      • 1970-01-01
      • 2022-01-10
      • 2021-04-01
      • 1970-01-01
      • 2021-12-09
      • 2018-02-05
      • 2021-04-15
      相关资源
      最近更新 更多