Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用Spring数据JPA创建自定义用户类型_Java_Spring_Spring Boot_Hibernate_Jpa - Fatal编程技术网

Java 无法使用Spring数据JPA创建自定义用户类型

Java 无法使用Spring数据JPA创建自定义用户类型,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,我正在尝试为我的数据库创建一个名为CompanyType的自定义用户类型。我将使用它只存储一个唯一的字符串作为最终对象的标识符(在代码中它是合法的和单独的) 公司类型的完整类别: public class CompanyType implements UserType { private String typeId; private String typeName; public static final CompanyType LEGAL = new Company

我正在尝试为我的数据库创建一个名为CompanyType的自定义用户类型。我将使用它只存储一个唯一的字符串作为最终对象的标识符(在代码中它是合法的和单独的)

公司类型的完整类别:

public class CompanyType implements UserType {

    private String typeId;
    private String typeName;

    public static final CompanyType LEGAL = new CompanyType("LEGAL", "Some legal type");
    public static final CompanyType INDIVIDUAL = new CompanyType("INDIVIDUAL", "Some individual type");

    public CompanyType(String typeId, String typeName) {
        this.typeId = typeId;
        this.typeName = typeName;
    }

    public String getTypeId() {
        return typeId;
    }

    public String getTypeName() {
        return typeName;
    }

    @Override
    public int[] sqlTypes() {
        return new int[]{Types.VARCHAR};
    }

    @Override
    public Class returnedClass() {
        return String.class;
    }

    @Override
    public boolean equals(Object o, Object o1) throws HibernateException {
        return o.equals(o1);
    }

    @Override
    public int hashCode(Object o) throws HibernateException {
        return o.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet resultSet, String[] strings, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException {
        if(resultSet.getString(strings[0]).equals("LEGAL")) return LEGAL;
        else return INDIVIDUAL;
    }

    @Override
    public void nullSafeSet(PreparedStatement preparedStatement, Object o, int i, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException {
        preparedStatement.setString(i, this.getTypeId());
    }

    @Override
    public Object deepCopy(Object o) throws HibernateException {
        CompanyType toCopy = (CompanyType) o;
        return new CompanyType(toCopy.getTypeId(), toCopy.getTypeName());
    }

    @Override
    public boolean isMutable() {
        return true;
    }

    @Override
    public Serializable disassemble(Object o) throws HibernateException {
        return (Serializable) o;
    }

    @Override
    public Object assemble(Serializable serializable, Object o) throws HibernateException {
        return serializable;
    }

    @Override
    public Object replace(Object o, Object o1, Object o2) throws HibernateException {
        return deepCopy(o);
    }
}
然后我尝试在我的实体-contracent.java中使用它

@Entity
public class Contragent {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private String INN;
    private String OGRN;

    @Type(type = "com.test.test1.CompanyType")
    private CompanyType companyType;

... other code

当我运行项目时,它会打印一个异常:

2021-03-15 02:15:07.831 ERROR 12824 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Unable to instantiate custom type: com.test.test1.CompanyType
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1153) ~[spring-context-5.3.4.jar:5.3.4]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:907) ~[spring-context-5.3.4.jar:5.3.4]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.4.jar:5.3.4]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.3.jar:2.4.3]
    at com.test.test1.Test1Application.main(Test1Application.java:11) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.3.jar:2.4.3]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Unable to instantiate custom type: com.test.test1.CompanyType
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[spring-orm-5.3.4.jar:5.3.4]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.4.jar:5.3.4]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.4.jar:5.3.4]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.4.jar:5.3.4]
    ... 22 common frames omitted
Caused by: org.hibernate.MappingException: Unable to instantiate custom type: com.test.test1.CompanyType
    at org.hibernate.type.TypeFactory.custom(TypeFactory.java:185) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.type.TypeFactory.byClass(TypeFactory.java:78) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:126) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:484) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:466) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.mapping.Property.isValid(Property.java:227) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:624) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.mapping.RootClass.validate(RootClass.java:267) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:354) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:298) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.4.jar:5.3.4]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.4.jar:5.3.4]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.4.jar:5.3.4]
    ... 26 common frames omitted
Caused by: java.lang.InstantiationException: com.test.test1.CompanyType
    at java.base/java.lang.Class.newInstance(Class.java:571) ~[na:na]
    at org.hibernate.type.TypeFactory.custom(TypeFactory.java:177) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
    ... 40 common frames omitted
Caused by: java.lang.NoSuchMethodException: com.test.test1.CompanyType.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3349) ~[na:na]
    at java.base/java.lang.Class.newInstance(Class.java:556) ~[na:na]
    ... 41 common frames omitted


Process finished with exit code 0
2021-03-15 02:15:07.831错误12824---[restartedMain]o.s.boot.SpringApplication:应用程序运行失败
org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactory”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/hibernatejPacConfiguration.class]中定义:调用init方法失败;嵌套异常为javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常为org.hibernate.MappingException:无法实例化自定义类型:com.test.test1.CompanyType
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1153)~[spring-context-5.3.4.jar:5.3.4]
在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:907)~[spring-context-5.3.4.jar:5.3.4]
在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582)~[spring-context-5.3.4.jar:5.3.4]
在org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)~[spring-boot-2.4.3.jar:2.4.3]
在org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)~[spring-boot-2.4.3.jar:2.4.3]
在org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)~[spring-boot-2.4.3.jar:2.4.3]
在org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)~[spring-boot-2.4.3.jar:2.4.3]
在org.springframework.boot.SpringApplication.run(SpringApplication.java:326)~[spring-boot-2.4.3.jar:2.4.3]
在org.springframework.boot.SpringApplication.run(SpringApplication.java:1311)~[spring-boot-2.4.3.jar:2.4.3]
在org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)~[spring-boot-2.4.3.jar:2.4.3]
在com.test.test1.Test1Application.main(Test1Application.java:11)~[classes/:na]
在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:na]
在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:na]
在java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:na]
在java.base/java.lang.reflect.Method.invoke(Method.java:566)~[na:na]
在org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)~[spring-boot-devtools-2.4.3.jar:2.4.3]
原因:javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常为org.hibernate.MappingException:无法实例化自定义类型:com.test.test1.CompanyType
在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)~[spring-orm-5.3.4.jar:5.3.4]
在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.AfterPropertieSet(AbstractEntityManagerFactoryBean.java:396)~[spring-orm-5.3.4.jar:5.3.4]
在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)~[spring-orm-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)~[spring-beans-5.3.4.jar:5.3.4]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)~[spring-beans-5.3.4.jar:5.3.4]
... 省略22个公共帧
原因:org.hibernate.MappingException:无法实例化自定义类型:com.test.test1.CompanyType
在org.hibernate.type.TypeFactory.custom(TypeFactory.java:185)~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
在org.hibernate.type.TypeFactory.byClass(TypeFactory.java:78)~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
在org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:126)~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
在org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:484)~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
在org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:466)~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
位于org.hibernate.mapping.Property.is