HHH000513:升级到 Hibernate 6 后无法为实体创建 ReflectionOptimizer

Aru*_*wda 3 java hibernate hibernate-6.x

最近从 Hibernate 5 升级到 6,我在调试级别看到以下错误。

12:36:11.892 [main] DEBUG org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl - HHH000513: Unable to create the ReflectionOptimizer for [abc.def.ghi.OrderEventEntity]
org.hibernate.bytecode.internal.bytebuddy.PrivateAccessorException: private accessor [createdTime]
    at org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.findAccessors(BytecodeProviderImpl.java:1250) ~[hibernate-core-6.2.2.Final.jar:6.2.2.Final]
Run Code Online (Sandbox Code Playgroud)

订单实体.java

@Data
@Entity
@Table(name = "OMS_ORDER_EVENTS")
public class OrderEventEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "oms_order_events_seq")
    @SequenceGenerator(name = "oms_order_events_seq", sequenceName = "OMS_ORDER_EVENTS_SEQ", allocationSize = 1)
    @Column(name = "ID")
    private Long id;

    @Column(name = "ORDER_ID")
    private Long orderId;

    @Column(name = "VERSION_NUMBER")
    private Integer versionNumber;

    @Column(name = "GENERATED_BY")
    @Enumerated(value = EnumType.STRING)
    private EventGenerator generatedBy;

    @Column(name = "USER_CONTACT_ID")
    private String userContactId;

    @Column(name = "EVENT_TYPE")
    @Enumerated(value = EnumType.STRING)
    private EventType eventType;

    @Column(name = "CREATED_TIME")
    private Date createdTime;
}
Run Code Online (Sandbox Code Playgroud)

互联网上没有任何与此相关的任何痕迹。目前我的 Spring Web 应用程序没有出现,我猜测这是否是问题所在。

编辑:

我认为有一个ClassDefNotFoundException来自其他外部库(与 Hibernate 无关)的文件,并且它没有打印在日志中。这就是我的申请没有出现的原因。

Gav*_*ing 6

12:36:11.892 [main] DEBUG 
Run Code Online (Sandbox Code Playgroud)

这是调试级别的日志消息。你为什么担心它?

更新

这个帖子上的其他答案是完全错误的,所以让我澄清一下实际情况

  1. Hibernate 是否如所声称的那样,默认使用字段访问?不,不是的。根据 JPA 规范的要求,当映射注释放置在字段上时,Hibernate 使用字段访问。如果映射注释放置在 getter 上,则它使用属性访问。
  2. Hibernate 是否应该按照声明在此处使用 getter 和 setter,而不是直接访问字段。不,绝对不应该。这不符合 JPA 规范。
  3. 这是一个问题吗?它是否会导致如所声称的“次优”性能?不,它不是,不,它不是。“反射优化器”最多对性能有极其微小的影响,在大多数情况下是无法测量的。
  4. 一般来说,当 Hibernate 或任何其他库在DEBUG级别上记录某些内容时,人们是否应该感到不安和担心?没有人不应该这样做。如果这确实是值得关注的事情,我们至少会记录一个WARN. 我们假设每个人都将日志级别设置INFO为默认值,因此当我们在该级别记录某些内容时DEBUG,因为它通常不值得关注
  5. 为了缓解这个问题,用户是否应该将@Access(AccessType.PROPERTY)注释分散在其实体类上?请不。不要那样做。那是糟糕的。这不是 JPA 的预期使用方式。

如果出于某种原因您确实更喜欢属性访问而不是字段访问,则可以将映射注释放在 getter 上。但这不再是我们的建议,也不再是 Hibernate 社区的常见做法。

我希望这会有所帮助,并且希望它能纠正该线程其他答案中的 FUD。

郑重声明:我是 Hibernate 的创建者,是最初向 Hibernate 添加“反射优化器”的人,也是实际编写 JPA 规范(包括规范的相关部分)的人之一。