首页 > 解决方案 > 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;
    }
}

标签: javaspringhibernate

解决方案


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

你可以像这样使用它:

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

推荐阅读