【问题标题】:Unknown integral data type for ids : java.lang.Stringid 的未知整数数据类型:java.lang.String
【发布时间】:2014-07-15 10:11:59
【问题描述】:

这是我的休眠映射:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="Entities.Product" table="products">
        <id column="name" name="name" type="java.lang.String">
            <generator class="increment"/>
        </id>
        <property column="cost" name="cost" type="java.lang.Integer"/>
    </class>
</hibernate-mapping>

该表由两列组成:name VARCHAR(20), cost Integer。

控制器:

@Controller
public class ProductController {

    @RequestMapping("/products.htm")
    public String getAllProducts() throws SQLException
    {
        ProductDAOImpl mapping = new ProductDAOImpl();
        Product p = new Product();
        p.setCost(1000);
        p.setName("Саморезы");
        mapping.addProduct(p);
        return "index";
    }     
}

addProduct方法:

public void addProduct(Product product) throws SQLException {
        Session session = Hibernate.util.HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.save(product);
        session.getTransaction().commit();
        session.close();
    }

当我尝试运行它时,我遇到了异常:

org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.String
    org.hibernate.id.IdentifierGeneratorHelper.getIntegralDataTypeHolder(IdentifierGeneratorHelper.java:215)
    org.hibernate.id.IncrementGenerator.initializePreviousValueHolder(IncrementGenerator.java:123)
    org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:69)
    org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
    org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
    org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
    org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
    org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
    org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
    DAOImpl.ProductDAOImpl.addProduct(ProductDAOImpl.java:26)
    Controllers.ProductController.getAllProducts(ProductController.java:20)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

如何解决?

【问题讨论】:

    标签: java hibernate spring-mvc


    【解决方案1】:

    您已将 id 添加为 &lt;generator class="increment"/&gt; 那么它必须是整数 在&lt;id column="name" name="name" type="integer"&gt;使用整数而不是字符串,更改休眠映射文件如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="Entities.Product" table="products">
            <id column="name" name="name" type="integer">
                <generator class="increment"/>
            </id>
            <property column="cost" name="cost" type="java.lang.Integer"/>
        </class>
    </hibernate-mapping>
    

    【讨论】:

    • 我有同样的情况,但我不能改变 id 的数据类型,因为实体是旧的并且它被其他组件使用,我可以做其他事情吗?
    【解决方案2】:

    您应该为您的产品使用技术 ID,而不是产品名称作为标识符。可能有两个具有相同名称的产品或更改其名称的产品。但是,如果您愿意,您可以省略生成器,并在保存之前始终将名称设置为唯一值。

    为您的技术 ID 添加一个数字列、一个 Long 成员变量和适当的映射,一切都应该正常工作。

    如果需要,您仍然可以使用索引来加快获取速度或使用唯一约束。

    如果有自动生成唯一产品名称的方法,您也可以编写自己的生成器。见this answer。

    【讨论】:

      【解决方案3】:

      如果您想使用字符串作为主键,请使用:

      <generator class="assigned"/>
      

      看https://www.javatpoint.com/generator-classes

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 2016-05-28
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 2021-04-12
        • 2016-09-16
        相关资源
        最近更新 更多