我知道这个问题以前可能有人问过,但我没有得到一个解决我的问题的方法。我有一个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>
在过去的两天里,请帮我解决这个问题
我不是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
我有这个我解决不了的问题,这是我的实体类: 最后一行是失败的,如果我移除它们,它起作用,我的意思是,它可以保存主题,但当我尝试这样做,它失败,我不知道如果我做错了什么,请帮助我!!