Property ‘attacker‘ may not be annotated ‘@BatchSize‘——JPA

报错问题

Caused by: org.hibernate.AnnotationException: error processing @AttributeBinderType annotation '@org.hibernate.annotations.BatchSize(size=100)'
	at org.hibernate.boot.model.internal.PropertyBinder.callAttributeBinders(PropertyBinder.java:288) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.PropertyBinder.callAttributeBindersInSecondPass(PropertyBinder.java:323) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.PropertyBinder.makeProperty(PropertyBinder.java:421) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:122) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1811) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1770) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:334) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) ~[spring-beans-6.1.10.jar:6.1.10]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-6.1.10.jar:6.1.10]
	... 15 more
Caused by: org.hibernate.AnnotationException: Property 'attacker' may not be annotated '@BatchSize'
	at org.hibernate.binder.internal.BatchSizeBinder.bind(BatchSizeBinder.java:47) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.binder.internal.BatchSizeBinder.bind(BatchSizeBinder.java:27) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.PropertyBinder.callAttributeBinders(PropertyBinder.java:285) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.PropertyBinder.callAttributeBindersInSecondPass(PropertyBinder.java:323) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.PropertyBinder.makeProperty(PropertyBinder.java:421) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.internal.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:122) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1811) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1770) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:334) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.10.jar:6.1.10]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) ~[spring-beans-6.1.10.jar:6.1.10]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-6.1.10.jar:6.1.10] 这个是什么问题

解释:

这个错误表明在使用Hibernate时,你试图在一个不允许的地方对属性进行了 @BatchSize 注解。具体来说,错误信息中提到:

Caused by: org.hibernate.AnnotationException: Property 'attacker' may not be annotated '@BatchSize'

这意味着你在名为 attacker 的属性上使用了 @BatchSize 注解,而实际上 @BatchSize 注解是不能用在所有类型的属性上的。通常,它只能用在集合(Collection)属性上,以便指定在加载这些集合时使用的批处理大小。

解决此问题的方法是:

确保你只在集合属性上使用 @BatchSize 注解,而不是在普通的单值属性(如基本类型、String、对象引用等)上使用。
检查你的实体类或映射文件,找到名为 attacker 的属性,并确保它是一个集合类型(例如 List、Set、Map 等)。
如果 attacker 是一个集合属性,并且你想为它设置批处理大小,那么请确认 @BatchSize 注解的位置正确,不应该用在其他类型的属性上。
总结来说,错误的根本在于 Hibernate 不允许在所有类型的属性上都使用 @BatchSize 注解,因此你需要仔细检查和调整注解的位置,确保其用在适当的地方。

发现我的问题是:

@BatchSize(size = 100)
    private AttackerProjection attacker;

解决方法:

根据你提供的信息,看起来 AttackerProjection 是一个对象引用,而不是一个集合(Collection)。问题出在 @BatchSize 注解只能用在集合类型的属性上,而不能用在单值类型(如对象引用)的属性上。

如果 AttackerProjection 是一个单独的对象引用,你不能直接在其上使用 @BatchSize 注解。@BatchSize 主要用于优化查询多个对象的集合时的性能,它会影响到 Hibernate 加载集合数据的方式。

如果你想要使用 @BatchSize 注解来优化 AttackerProjection 的加载性能,需要将其定义为一个集合类型,比如一个集合或者一个数组。例如:

@BatchSize(size = 100)
private List<AttackerProjection> attackers;

或者,如果 AttackerProjection 是一个需要优化加载性能的对象,你可能需要考虑其他的加载策略或者缓存配置,而不是使用 @BatchSize 注解。

如果 AttackerProjection 是一个单值类型的属性(非集合),那么你就不能使用 @BatchSize 注解,因为这会导致 Hibernate 抛出 AnnotationException 异常,就像你遇到的问题一样。

因此,请根据你的实际需求和 AttackerProjection 属性的类型,来决定是否需要使用 @BatchSize 注解以及如何正确使用它。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值