当前位置: 首页 > 知识库问答 >
问题:

org.hibernate.id.IdentifierGenerationException:在调用save()之前必须手动分配该类的ID:

隆向晨
2023-03-14

我知道这个问题以前可能有人问过,但我没有得到一个解决我的问题的方法。我有一个varchar(20)的categoryID的主键列,实体类通过id属性映射到该主键列。在添加数据时,它采用通过UI输入的id值,但在编辑其他字段并通过UI保存时,它抛出异常“IdentifierGenerationException:在调用save()之前必须手动分配该类的id:”

请找到下面的代码:

          Category.java
          -------------
          package com.niit.cakecuisinebe.model;

          import java.util.UUID;

          import javax.persistence.Column;
          import javax.persistence.Entity;
          import javax.persistence.Id;
          import javax.persistence.PrePersist;
          import javax.persistence.Table;

          import org.springframework.stereotype.Component;

        @Entity
        @Table
        @Component
        public class Category {

            @Id
            @Column(name="CATEGORYID")
            private String id;


            public String getId() {
                return id;
            }
            public void setId(String id) {
                this.id = id;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String getDescription() {
                return description;
            }
            public void setDescription(String description) {
                this.description = description;
            }
            @Column(name="CATEGORYNAME")
            private String name;
            @Column(name="CATEGORYDESCRIPTION")
            private String description;
        }
        CategoryDAOImpl
        ----------------
        package com.niit.cakecuisinebe.dao;

        import java.util.List;


        import javax.transaction.Transactional;

        import org.hibernate.Criteria;
        import org.hibernate.Query;
        import org.hibernate.SessionFactory;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Repository;

        import com.niit.cakecuisinebe.model.Category;
        @Repository("categoryDAO")
        public class CategoryDAOImpl implements CategoryDAO{

            @Autowired
            private SessionFactory sessionFactory;

            public CategoryDAOImpl(SessionFactory sessionFactory) {
                this.sessionFactory = sessionFactory;
            }

            @Transactional
            public List<Category> list()
            {
                //Logger.debug("calling list");

                @SuppressWarnings("unchecked")
                List<Category> listCategory = (List<Category>) 
                          sessionFactory.getCurrentSession()
                        .createCriteria(Category.class)
                        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
            //  Logger.debug("calling list");
                return listCategory;
            }

            @Transactional
            public Category get(String id) {
                // TODO Auto-generated method stub
                String hql = "from Category where id=" + "'"+ id +"'";
                //  from category where id = '101'
                Query query =  sessionFactory.getCurrentSession().createQuery(hql);
                List<Category> listCategory = (List<Category>) query.list();

                if (listCategory != null && !listCategory.isEmpty()) {
                    return listCategory.get(0);
                }
                return null;
            }

            @Transactional
            public void saveOrUpdate(Category category) {
                // TODO Auto-generated method stub
                sessionFactory.getCurrentSession().saveOrUpdate(category);
            }
            @Transactional
            public void delete(String id) {
                // TODO Auto-generated method stub
                Category category = new Category();
                category.setId(id);
                sessionFactory.getCurrentSession().delete(category);
            }

            @Transactional
            public Category getByName(String name) {
                // TODO Auto-generated method stub
                String hql = "from Category where name=" + "'"+ name +"'";
                Query query = sessionFactory.getCurrentSession().createQuery(hql);

                @SuppressWarnings("unchecked")
                List<Category> listCategory = (List<Category>) query.list();

                if (listCategory != null && !listCategory.isEmpty()) {
                    return listCategory.get(0);
                }

                return null;

            }

        }
        CategoryController
        --------------------
        package com.niit;

        import java.util.List;
        import java.util.Map;

        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        import org.apache.log4j.Logger;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Controller;
        import org.springframework.ui.Model;
        import org.springframework.ui.ModelMap;
        import org.springframework.web.bind.annotation.ModelAttribute;
        import org.springframework.web.bind.annotation.PathVariable;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestMethod;

        import com.niit.cakecuisinebe.dao.CategoryDAO;
        import com.niit.cakecuisinebe.model.*;


        @Controller
        public class CategoryController {
            protected static Logger logger = Logger.getLogger("CategoryController");
            @Autowired
            private CategoryDAO categoryDao;

            @RequestMapping(value = "/ViewCategory", method = RequestMethod.GET)
            public String getCategory(Model model) {

                logger.info("entering showAllGreetings");
                model.addAttribute("category", new Category());

                List<Category> categories = categoryDao.list();
                if (!categories.isEmpty()) {

                    model.addAttribute("categorylist", categories);
                }

                return "Category";
            }

            @RequestMapping(value = "/addCategory", method = RequestMethod.POST)
            public String addCategory(@ModelAttribute("category") Category category) {
                logger.info("entering showAllGreetings");

                categoryDao.saveOrUpdate(category);

                return "redirect:/ViewCategory";

            }

            @RequestMapping(value = "edit/addCategory", method = RequestMethod.POST)
            public String editCategory(@ModelAttribute("category") Category category) {
                logger.info("entering showAllGreetings");

                String id=category.getId();
                category.setId(id);
                categoryDao.saveOrUpdate(category);

                return "redirect:/ViewCategory";

            }

            @RequestMapping(value = "delete/{id}", method = RequestMethod.GET)
            public String deleteCategory(@PathVariable("id") String id, ModelMap model) {
                logger.info("entering showAllGreetings");

                categoryDao.delete(id);
                model.addAttribute("{msg}", "Successfully Deleted");
                return "redirect:/ViewCategory";
            }

            @RequestMapping(value = "edit/{id}", method = RequestMethod.GET)
            public String showEditCategory(@PathVariable("id") String id, Model model) {
                logger.info("entering showAllGreetings");

                model.addAttribute("category", this.categoryDao.get(id));
                model.addAttribute("categorylist", categoryDao.list());

                return "Category";
            }
        }
        <div  >
        <spring:form method="POST"  action="addCategory" modelAttribute="category" align="center">
        <table cellpadding="5" cellspacing="5" style="height=45px; width=45px; background-color: pink; padding=10px">
            <tr>

                <c:choose>
                 <c:when test="${!empty category.id}">
                  <td><spring:label path="id"><springtags:message text="CategoryID"></springtags:message></spring:label></td>
                  <td><spring:input path="id" disabled="true" readonly="true" /></td>
                 </c:when>
                 <c:otherwise>
                    <td><spring:label path="id"><springtags:message text="CategoryID"></springtags:message></spring:label></td>
                    <td><spring:input path="id" /></td>
                 </c:otherwise>
                </c:choose>
            </tr>
            <tr>
                <td> Category Name:</td>
                <td><spring:input path="name" /></td>
            </tr>
             <tr>
                <td> Category Description:</td>
                <td><spring:input path="description" /></td>
            </tr>



            <tr>

               <c:if test="${!empty category.id}">
                            <td>    <input type="submit"
                                    value="<springtags:message text="Edit Category"/>" />
                            </c:if> 
                            </td>
                            <td><c:if test="${empty category.id}">
                                <input type="submit" value="<springtags:message text="Add Category"/>" />
                            </c:if>
                            </td>
            </tr>


        </table>
        </spring:form>
            </div>

            <div class="container">
            <table class="table table-striped table-bordered table-hover table-condensed">
            <caption><h2>Categories</h2></caption>
            <thead>
              <tr>
              <th>Category ID</th>
               <th>Category Name</th>
               <th>Category Description</th>
               <th>Edit</th>
               <th>Delete</th>
              </tr>
              </thead>
                 <c:if test="${not empty categorylist}" >
                 <tbody>
                    <c:forEach items="${categorylist}" var="category">      
                    <tr>
                    <td>${category.id}</td>
                    <td>${category.name}</td>
                    <td>${category.description} </td>
                    <td><a href="edit/${category.id}">Edit</a> </td>
                    <td><a href="delete/${category.id}">Delete</a> </td>
                    </tr>       
                    </c:forEach>
                </tbody>    
        </c:if>
        <c:if test="${empty categorylist}" >
            There are no category yet. 
        </c:if>
              </tr>


        </table>
        </div>
         <%@ include file="footer.jsp"%>
        </body>
        </html> 

在过去的两天里,请帮我解决这个问题

共有1个答案

韦正业
2023-03-14

我不是String类型的ID的大粉丝。您应该换一个长ID。因此,您可以将id的生成委托给带有一些排序内容的数据库。

如果希望实际colomn中的数据是唯一的,只需创建另一个字段,其中包含唯一的禁忌。

 类似资料:
  • 我有一个包含字段名、姓、性别、电子邮件、密码、DOB、地址和角色的user类。 我想创建电子邮件作为我的主键,因此我有@id,但由于它是字符串类型,我不能使用@Generation注释。每当我尝试在Db中插入一个新用户时,我都会得到一个错误,嵌套的异常是org.hibernate.id.IdentifierGenerationException:在使用根本原因调用save():com.niit.m

  • 我在Hibernate和映射方面遇到了一些问题。 下面是我的功能: 每次调用函数时,我都得到: 对于此行: 我不明白为什么。因为在这种情况下,不需要手动分配位置的id,因为它是自动生成的。我一定是做错了什么,但三天后,我没有发现。 如果将来对其他人有帮助,只需通过以下方法修改id的参数:

  • 问题内容: 我在hibernate映射方面遇到了一些问题。就像这里 : 当我打电话给我时,出现异常: 为何hibernate无法单独使用这些ID?怎么了 问题答案: 首先-它不能生成它们,因为您没有告诉它怎么做。使用并选择所需的策略。 然后-您不能有两个字段。如果您想使用复合ID,请使用或

  • 我的数据库上需要一个主键。 问题是,如果我在注释字段中使用类型,那么当我尝试保存对象时,Hibernate会抛出一个异常。 是的,我正在为字段设置一个值。 将批注添加到字段-未工作 将字段类型更改为-这对我是不可行的 添加接收作为参数的构造函数-未工作 使用UUID-我不能,因为此id是由POST请求中的字段设置的。 这些变通办法对我都没用。 更新 我发布的请求: MyService.java

  • 我有这个我解决不了的问题,这是我的实体类: 最后一行是失败的,如果我移除它们,它起作用,我的意思是,它可以保存主题,但当我尝试这样做,它失败,我不知道如果我做错了什么,请帮助我!!