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

mbyulnm0  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(319)

最近从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]

OrderEntity.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;
}

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

tyky79it

tyky79it1#

短篇小说

@Access(AccessType.PROPERTY)注解放在实体类上。

说来话长

当Hibernate从DB阅读数据时,它需要以某种方式示例化实体对象并填充其字段值,有几个选项可以做到这一点:
1.使用反射访问
1.生成一些帮助类,它将以更优化的方式完成这一任务(是的,反射访问仍然很慢)
您正在观察的异常

PrivateAccessorException: private accessor [createdTime]

是指:Hibernate试图生成helper类,但发现特定的createdTime字段具有私有访问权限,这反过来又阻止了helper类的生成。然而,实际的根本原因是Hibernate甚至没有考虑实体类中存在的getter和setter方法(POJO“属性”),只是因为默认情况下Hibernate更喜欢使用字段访问而不是属性访问(请检查https://thorben-janssen.com/access-strategies-in-jpa-and-hibernate/)。总的来说,你是对的:这种异常不是良性的--它表明你得到的是次优的Hibernate行为。

wnvonmuf

wnvonmuf2#

12:36:11.892 [main] DEBUG

这是一条 * 调试 * 级别的日志消息。你担心什么?

更新

这个帖子上的另一个回应是错误的,所以让我澄清一下 * 实际情况 *。

  1. Hibernate是否如声明的那样默认使用字段访问。**不需要。*Hibernate在Map注解放置在字段上时使用字段访问, 这是JPA规范要求的 *。如果Map注解放在getter上,则使用属性访问。
  2. Hibernate是否应该像声明的那样在这里使用getter和setter,而不是直接访问字段。**不,它绝对不应该。**这不符合JPA规范。
    1.这有问题吗它是否会导致声称的“次优”性能?不,它不是,也不是。“反射优化器”对性能的影响最多是极其微小的,在大多数情况下是不可测量的。
    1.一般来说,当Hibernate或任何其他库在DEBUG级别记录一些东西时,人们应该感到不安和担心吗?**没有人不应该。**如果它实际上是值得关注的事情,我们至少会记录一个WARN。我们假设每个人的日志级别都默认设置为INFO,所以当我们在DEBUG上记录一些东西时,这是因为 * 它通常不值得关注 *。
    1.用户是否应该将@Access(AccessType.PROPERTY)注解分散在他们的实体类中来缓解这个问题?“请不要这样做。太可怕了这不是JPA的使用方式。
    如果您出于某种原因更喜欢属性访问而不是字段访问,则可以将Map注解放在getter上。但这不再是我们的建议,在Hibernate社区中也不再是常见的做法。
    我希望这能有所帮助,我希望它能纠正这条线上其他答案中的FUD。

**声明:**我是Hibernate的创建者,最初将“反射优化器”添加到Hibernate的人,以及实际编写JPA规范的人之一,包括规范的相关部分。

相关问题