最近从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应用程序还没有出现,我在猜测这是否是问题所在。
2条答案
按热度按时间tyky79it1#
短篇小说
将
@Access(AccessType.PROPERTY)
注解放在实体类上。说来话长
当Hibernate从DB阅读数据时,它需要以某种方式示例化实体对象并填充其字段值,有几个选项可以做到这一点:
1.使用反射访问
1.生成一些帮助类,它将以更优化的方式完成这一任务(是的,反射访问仍然很慢)
您正在观察的异常
是指:Hibernate试图生成helper类,但发现特定的
createdTime
字段具有私有访问权限,这反过来又阻止了helper类的生成。然而,实际的根本原因是Hibernate甚至没有考虑实体类中存在的getter和setter方法(POJO“属性”),只是因为默认情况下Hibernate更喜欢使用字段访问而不是属性访问(请检查https://thorben-janssen.com/access-strategies-in-jpa-and-hibernate/)。总的来说,你是对的:这种异常不是良性的--它表明你得到的是次优的Hibernate行为。wnvonmuf2#
这是一条 * 调试 * 级别的日志消息。你担心什么?
更新
这个帖子上的另一个回应是错误的,所以让我澄清一下 * 实际情况 *。
1.这有问题吗它是否会导致声称的“次优”性能?不,它不是,也不是。“反射优化器”对性能的影响最多是极其微小的,在大多数情况下是不可测量的。
1.一般来说,当Hibernate或任何其他库在
DEBUG
级别记录一些东西时,人们应该感到不安和担心吗?**没有人不应该。**如果它实际上是值得关注的事情,我们至少会记录一个WARN
。我们假设每个人的日志级别都默认设置为INFO
,所以当我们在DEBUG
上记录一些东西时,这是因为 * 它通常不值得关注 *。1.用户是否应该将
@Access(AccessType.PROPERTY)
注解分散在他们的实体类中来缓解这个问题?“请不要这样做。太可怕了这不是JPA的使用方式。如果您出于某种原因更喜欢属性访问而不是字段访问,则可以将Map注解放在getter上。但这不再是我们的建议,在Hibernate社区中也不再是常见的做法。
我希望这能有所帮助,我希望它能纠正这条线上其他答案中的FUD。
**声明:**我是Hibernate的创建者,最初将“反射优化器”添加到Hibernate的人,以及实际编写JPA规范的人之一,包括规范的相关部分。