java - Hibernate @Id 可以是字符串吗?
问题描述
我有一张包含公司办公室信息的表格,它的 ID 是一个字符串。我正在尝试使用@Id
标签在 Hibernate 中映射它,但它给了我一个错误java.lang.NumberFormatException
这让我想知道是否可以将字符串用作 Id,或者我是否遗漏了什么?
这是错误:
Jul 23, 2020 1:18:09 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet [jsp] threw exception
java.lang.NumberFormatException: For input string: "officeCode"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at javax.el.ListELResolver.coerce(ListELResolver.java:150)
at javax.el.ListELResolver.getValue(ListELResolver.java:67)
...
这是办公室类:
package com.ver.company.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "offices")
public class Office implements Serializable{
public Office() {}
@Id
private String officeCode;
@Column
private String city;
@Column
private String phone;
@Column
private String addressLine1;
@Column
private String addressLine2;
@Column
private String state;
@Column
private String country;
@Column
private String postalCode;
@Column
private String territory;
}
}
道实现:
package dom.ver.company.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import dom.ver.company.model.Office;
@Repository
public class OfficeDaoImpl implements OfficeDao {
public OfficeDaoImpl () {}
@Autowired
private SessionFactory sessionFactory;
public void insertOffice(Office office) {
sessionFactory.getCurrentSession().saveOrUpdate(office);
}
public List<Office> selectOffices() {
return sessionFactory.getCurrentSession().createQuery("from Office")
.list();
}
}
服务:
package dom.ver.company.service;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import dom.ver.company.OfficeDao;
import dom.ver.company.dao.OfficeDaoImpl;
import dom.ver.company.model.Office;
@Service
@Transactional
public class OfficeServiceImpl implements OfficeService {
@Autowired
private OfficeDao officeDao;
@Override
@Transactional
public List<Office> selectOffices() {
return officeDao.selectOffices();
}
}
控制器类:
package dom.ver.company.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import dom.ver.company.model.Office;
import dom.ver.company.service.OfficeService;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
@Controller
public class OfficeController {
@Autowired
OfficeService officeServiceImpl;
OfficeController(){}
@RequestMapping({ "/", "/index" })
public ModelAndView loadIndex(ModelAndView model) {
List<Office> officeList = officeServiceImpl.selectOffices();
model.addObject("officeList", officeList);
model.setViewName("index");
return model;
}
}
解决方案
如果不指定生成策略,Hibernate 将使用GenerationType.AUTO
,这不适用于String
.
你可以像这样使用它:
@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name="uuid", strategy="uuid2")
private String officeCode;
推荐阅读
- azure - Spacy 无法加载模型:Azure 数据块中的 en_core_web_md
- c# - 是否存在没有默认值的可选参数,除非通过/指定/使用,否则“不存在”?
- c# - 如何从类中获取特定类型的所有可枚举属性
- javascript - 添加非额外 Reducer 时 Redux Toolkit Slice Reducer 不工作
- mysql - 我在向 Datagridview 显示 mysql 行时遇到问题
- html - Tweeter 与自动化代码不同的 Twitter 组件中的 data-testid 是什么?
- r - 将 R 中的大型数据集与不同的列合并
- python - 0 轴是使用 pcolormesh 和 matplotlib.pyplot.subplots 生成的
- casting - 使用 rdrand 指令生成给定范围的随机数
- graphql - Graphql Apollo Federation - 基于实现服务解析计算域