gpt4 book ai didi

java - Hibernate 仅在类为 Final 时才起作用 [否则抛出 SingleTableEntityPersister]

转载 作者:行者123 更新时间:2023-11-30 01:55:52 24 4
gpt4 key购买 nike

我尝试构建非常简单的实体并使用 Hibernate 5.4.1.Final 和 Java8 将其保存在数据库中。为了消除状态突变,将跳过“ setter ”并使用@Access(AccessType.FIELD)。不幸的是,当 Hibernate 启动时,会抛出此异常:

org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'entityManagerFactory' defined in class path resource [application-context.repositories.xml]:
Invocation of init method failed;
nested exception is javax.persistence.PersistenceException:
[PersistenceUnit: default] Unable to build Hibernate SessionFactory;
nested exception is org.hibernate.MappingException:
Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

我发现在将产品类定为最终版本后,一切正常。问题是我不明白为什么??? 你能帮我理解发生了什么吗?

一些代码。这不起作用:

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Getter;

@Entity
@Access(AccessType.FIELD)
@Table(name = "product")
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Getter
private String name;

@Getter
private String colour;

protected Product() {
}

@Builder
public Product(String name, String colour) {
this.name = name;
this.colour = colour;
}
}

添加final就足够了

public final class Product {

并且它有效。

application-context.repositories.xml 只通知 spring 存储库在哪里

  <jpa:repositories base-package="a.b.c.repositories"/>

在调试时我还发现下面的异常之一是

HibernateException ->  Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

知道为什么需要“最终”吗?

//编辑

安德洛尼克斯指出了正确的方向:

现在我知道如果类不是最终的,hibernate会尝试构建一个代理,异常来自ByteBuddyProxyHelper.class

return byteBuddyState.loadProxy( persistentClass, new TypeCache.SimpleKey(key), byteBuddy -> byteBuddy
.ignore( byteBuddyState.getProxyDefinitionHelpers().getGroovyGetMetaClassFilter() )
.with( new NamingStrategy.SuffixingRandom( PROXY_NAMING_SUFFIX, new NamingStrategy.SuffixingRandom.BaseNameResolver.ForFixedValue( persistentClass.getName() ) ) )
.subclass( interfaces.length == 1 ? persistentClass : Object.class, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING )
.implement( (Type[]) interfaces )
.method( byteBuddyState.getProxyDefinitionHelpers().getVirtualNotFinalizerFilter() )
.intercept( byteBuddyState.getProxyDefinitionHelpers().getDelegateToInterceptorDispatcherMethodDelegation() )
.method( byteBuddyState.getProxyDefinitionHelpers().getHibernateGeneratedMethodFilter() )
.intercept( SuperMethodCall.INSTANCE )
.defineField( ProxyConfiguration.INTERCEPTOR_FIELD_NAME, ProxyConfiguration.Interceptor.class, Visibility.PRIVATE )
.implement( ProxyConfiguration.class )
.intercept( byteBuddyState.getProxyDefinitionHelpers().getInterceptorFieldAccessor() )
);

最佳答案

不确定,为什么使用final关键字它会起作用,也许它与代理生成有关。我认为这里的问题是来自 lombok 的 @Builder 。一个bug据报道,添加 @Builder 注释会删除 hibernate 所需的默认构造函数。

关于java - Hibernate 仅在类为 Final 时才起作用 [否则抛出 SingleTableEntityPersister],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54539094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com