Java Hibernate@Id可以是字符串吗?

Java Hibernate@Id可以是字符串吗?,java,spring,hibernate,Java,Spring,Hibernate,我有一个表格,里面有一些公司办公室的信息,它的Id是一个字符串。我试图在Hibernate中用@Id标记映射它,但是它给了我一个java.lang.NumberFormatException 这让我想知道是否可以使用字符串作为ID,或者我是否遗漏了什么 以下是错误: Jul 23, 2020 1:18:09 PM org.apache.catalina.core.ApplicationDispatcher invoke SEVERE: Servlet.service() for servlet

我有一个表格,里面有一些公司办公室的信息,它的Id是一个字符串。我试图在Hibernate中用
@Id
标记映射它,但是它给了我一个
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)
...
这是office类:

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;
    }
}
Dao实现:

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();
    }
}
包dom.ver.company.dao;
导入java.util.List;
导入org.hibernate.SessionFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Repository;
导入dom.ver.company.model.Office;
@存储库
公共类OfficeDAImpl实现OfficeDao{
公职人员名单(){}
@自动连线
私人会话工厂会话工厂;
公共空白插入办公室(办公室){
sessionFactory.getCurrentSession().saveOrUpdate(office);
}
公营办事处名单({
返回sessionFactory.getCurrentSession().createQuery(“从办公室”)
.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();
    }
}
包dom.ver.company.service;
导入java.sql.SQLException;
导入java.util.List;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Service;
导入org.springframework.transaction.annotation.Transactional;
导入dom.ver.company.OfficeDao;
导入dom.ver.company.dao.officedaimpl;
导入dom.ver.company.model.Office;
@服务
@交易的
公共类OfficeServiceImpl实现OfficeService{
@自动连线
私人官办;
@凌驾
@交易的
公营办事处名单({
返回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;
    }
}
包dom.ver.company.controller;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Controller;
导入org.springframework.web.bind.annotation.ModelAttribute;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入org.springframework.web.servlet.ModelAndView;
导入dom.ver.company.model.Office;
导入dom.ver.company.service.OfficeService;
导入java.util.List;
导入javax.servlet.http.HttpServletRequest;
@控制器
公共类办公控制器{
@自动连线
OfficeService officeServiceImpl;
OfficeController(){}
@请求映射({”/“,“/index”})
公共模型和视图加载索引(模型和视图模型){
List officeList=officeServiceImpl.selectOffices();
model.addObject(“officeList”,officeList);
model.setViewName(“索引”);
收益模型;
}
}

如果未指定生成策略,Hibernate将使用
GenerationType.AUTO
,这不适用于
字符串

您可以这样使用它:

@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name="uuid", strategy="uuid2")
private String officeCode;

如果未指定生成策略,Hibernate将使用
GenerationType.AUTO
,这不适用于
String

您可以这样使用它:

@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name="uuid", strategy="uuid2")
private String officeCode;

这有用吗?请看例外情况。它不是从冬眠开始的。检查您正在使用的jsp或视图,它位于jsp中,而不是来自Hibernate。无论如何,谢谢。这有用吗?请看例外情况。它不是从冬眠开始的。检查您正在使用的jsp或视图,它位于jsp中,而不是来自Hibernate。无论如何,谢谢你。