java,数据库是sqlserver,设置hbm.xml文档的时候,<generator class="native" ></generator>报以下错误:
严重: Servlet.service() for servlet [Servlet.testServlet] in context with path [/JavaEE] threw exception
java.lang.ClassCastException: class org.hibernate.id.IdentifierGeneratorHelper$2 cannot be cast to class java.lang.Integer (org.hibernate.id.IdentifierGeneratorHelper$2 is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @6dd13776; java.lang.Integer is in module java.base of loader 'bootstrap')
at org.hibernate.type.descriptor.java.internal.IntegerJavaDescriptor.unwrap(IntegerJavaDescriptor.java:26)
at org.hibernate.type.descriptor.sql.spi.IntegerSqlDescriptor$1.doBind(IntegerSqlDescriptor.java:67)
at org.hibernate.sql.AbstractJdbcValueBinder.bind(AbstractJdbcValueBinder.java:69)
at org.hibernate.sql.ast.tree.expression.LiteralParameter.bindParameterValue(LiteralParameter.java:86)
at org.hibernate.sql.exec.internal.JdbcMutationExecutorImpl.execute(JdbcMutationExecutorImpl.java:61)
at org.hibernate.sql.exec.internal.JdbcMutationExecutorImpl.execute(JdbcMutationExecutorImpl.java:109)
at org.hibernate.metamodel.model.domain.internal.entity.SingleTableEntityTypeDescriptor.executeOperation(SingleTableEntityTypeDescriptor.java:768)
at org.hibernate.metamodel.model.domain.internal.entity.SingleTableEntityTypeDescriptor.executeInsert(SingleTableEntityTypeDescriptor.java:384)
at org.hibernate.metamodel.model.domain.internal.entity.SingleTableEntityTypeDescriptor.executeInsert(SingleTableEntityTypeDescriptor.java:376)
at org.hibernate.metamodel.model.domain.internal.entity.SingleTableEntityTypeDescriptor.insertInternal(SingleTableEntityTypeDescriptor.java:204)
at org.hibernate.metamodel.model.domain.spi.AbstractEntityTypeDescriptor.insert(AbstractEntityTypeDescriptor.java:885)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:79)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:643)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:278)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:259)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:313)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:392)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:301)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:208)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:139)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:190)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:36)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:30)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:71)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:685)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:677)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:672)
at Action.InforDeal2.save(InforDeal2.java:28)
at Servlet.testServlet.doGet(testServlet.java:58)
at Servlet.testServlet.doPost(testServlet.java:74)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:501)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:835)
但是<generator class="increment" ></generator>的时候,能正常执行,请教一下原因在哪里?
hbm.xml代码:<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>    <class name="Model.Student" table="student">
        <id name="id" type="java.lang.Integer" >
         <column name="id" />
            <generator class="native" ></generator>
        </id>
        <property name="name" type="string" column="uname"/>
        <property name="age" type="int" column="age"/>
        <property name="phone" type="string" column="phone"/>
        <property name="address" type="string" column="address"/>
    </class></hibernate-mapping>
实体类代码:
public class Student {
private Integer id;
private String name;
private int age;
private String phone;
private String address;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}

解决方案 »

  1.   

    类型转换错误,修改为int,或者不写类型试试
      

  2.   

    换成int也是一样的错误
      

  3.   

    换成int也是一样的错误
    是不是类型跟sqlsever类型不匹配,指名数据库的字段类型
      

  4.   

    换成int也是一样的错误
    是不是类型跟sqlsever类型不匹配,指名数据库的字段类型
    怎么样指定数据库的字段类型呢?在数据库里操作?hibernate自动生成表,在代码里面指定吗?
      

  5.   

    真心觉得hiberate不好用,烦琐,效率不高,我都是自己写数据处理框架。
      

  6.   

    这篇文章:hibernate主键增长increment与native的区别
      

  7.   

    java.lang.ClassCastException: class org.hibernate.id.IdentifierGeneratorHelper$2 cannot be cast to class java.lang.Integer
    这不是很明显吗,你用native最后id生成的是类型IdentifierGeneratorHelper$2,看样子是个匿名内部类,类型转换出错啦,而且现在大多数主键策略都使用UUID啦
      

  8.   

    换成int也是一样的错误
    是不是类型跟sqlsever类型不匹配,指名数据库的字段类型
    怎么样指定数据库的字段类型呢?在数据库里操作?hibernate自动生成表,在代码里面指定吗?
    在代码中指定当前的数据库类型
      

  9.   

    我知道是类型转换错误,就是不明白为什么increment可以,native就会报错,原因是什么,怎么解决
      

  10.   

    我明白这两个的区别,就是不知道为什么increment不报错,native就会报错,找不到问题在哪里