id 的未知整数数据类型:java.lang.String

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24755500/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 14:42:39  来源:igfitidea点击:

Unknown integral data type for ids : java.lang.String

javahibernatespring-mvc

提问by St.Antario

Here is my hibernate-mapping:

这是我的休眠映射:

<?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>

The table consist of two columns: name VARCHAR(20), cost Integer.

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

Controller:

控制器:

@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 method:

添加产品方法:

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

When I'm trying to run this I have exception:

当我尝试运行它时,我有例外:

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)

How to fix that?

如何解决?

采纳答案by vipin cp

you have added the id as <generator class="increment"/>then it must be integer use integer instead of string at <id column="name" name="name" type="integer">,change the hibernate mapping file as shown below

您已经添加了 id,因为<generator class="increment"/>它必须是整数 使用整数而不是字符串 at <id column="name" name="name" type="integer">,更改休眠映射文件,如下所示

<?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>

回答by flob

You should use a technical id for your product and not the name of the product as the identifier. There might be two products with the same name or products that change their name. But if you want you could just leave out the generator and always set the name to a unique value before saving.

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

Add a number column, a Long member variable and the appropriate mapping for your technical Id and everything should work.

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

You still can use a index for faster fetching or a unique constraint if you want.

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

As an alternative you could write your own generator if there is a automatic way to generate unique product names. See this answer.

作为替代方案,如果有自动生成唯一产品名称的方法,您可以编写自己的生成器。看到这个答案

回答by Gelberth Amarillo Rojas

If you want to use a String as Primary Key, use:

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

<generator class="assigned"/>

look at https://www.javatpoint.com/generator-classes

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