hibernate |标识符生成异常

ars1skjm  于 2023-03-30  发布在  其他
关注(0)|答案(4)|浏览(170)

当我尝试通过hib持久层保存一些数据时,遇到异常,异常如下

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): hbm.Employee

public void saveEmployee(Employee empValue) {
        Session session = null;
        Transaction tx = null;
        session = HibernateSessionFactory.getSession();
        tx = session.beginTransaction();
        Employee emp;
        if (empValue.getEmpcode() != null) {
            emp = (Employee) session.get(Employee.class, empValue.getEmpcode());
            if (emp != null) {
                System.out.println("Test");
                emp.setEmpcode(empValue.getEmpcode());
                emp.setDepartment(createDepartment("DEEE"));
                emp.setEmpfname(empValue.getEmpfname());
                emp.setEmplname(empValue.getEmplname());
                emp.setEmpdob(empValue.getEmpdob());
                emp.setEmpstatus(empValue.getEmpstatus());
                emp.setEmptelno(empValue.getEmptelno());
                emp.setAuditfield(empValue.getAuditfield());
                session.update(emp);
            }
        } else 
        {
            emp = new Employee();
            emp.setEmpcode(empValue.getEmpcode());
            emp.setDepartment(createDepartment("DEEE"));
            emp.setEmpfname(empValue.getEmpfname());
            emp.setEmplname(empValue.getEmplname());
            emp.setEmpdob(empValue.getEmpdob());
            emp.setEmpstatus(empValue.getEmpstatus());
            emp.setEmptelno(empValue.getEmptelno());
            emp.setAuditfield(empValue.getAuditfield());
            session.save(emp);
        }
        tx.commit();
    }

正如您所看到的,类被分配在适当的位置,我对异常感到困惑,希望得到一些帮助..

xggvc2p6

xggvc2p61#

这个异常表明你没有给Employee类中标记为@id的字段赋值。这个类看起来是什么样子的?你是试图通过提供的生成器之一生成Id值还是想手动设置它们?

brqmpdu1

brqmpdu12#

异常消息ids for this class must be manually assigned before calling save()是自解释的。
发生这种情况是因为您使用的是assigned内置生成器。assigned生成器显式地告诉Hibernate应用程序将分配标识符。从5.1.4.1节。生成器:
让应用程序在调用save()之前为对象分配一个标识符。如果没有指定<generator>元素,这是默认策略。
如果这不是您想要的,请使用另一个生成器,例如native(此 * 选择identitysequencehilo,具体取决于底层数据库的功能 *):

<class name="LineItem" table="`Line Item`">
  <id name="id" column="`Item Id`"/>
    <generator class="native"/>
  </id>
  ...
</class>
vh0rcniy

vh0rcniy3#

使用以下类型的代码来保存员工,如果这没有帮助,请粘贴Map文件以了解字段empCode的详细信息。

helper = new HibernateHelper();
Customer custObject;
 if (customer.getId() == 0) {
                custObject = new Customer();
                custObject.setCreatetimestamp(new Timestamp(System.currentTimeMillis()));
            } else {
                custObject = (Customer) helper.getSession().load(Customer.class, customer.getId());
            }
            custObject.setName(customer.getName());
            custObject.setAddress(customer.getAddress());
            custObject.setBillToAddress(customer.getBillToAddress());
            custObject.setBillToPerson(customer.getBillToPerson());
            custObject.setUpdatetimestamp(new Timestamp(System.currentTimeMillis()));
            custObject.setEmail(customer.getEmail());
            custObject.setDeleted(false);
            Currency curr = (Currency) helper.getSession().load(Currency.class, x);
            custObject.setCurrencyId(curr);

            custId = (Long) helper.getSession().save(custObject);
            helper.commit();
jobtbby3

jobtbby34#

如果你正在使用spring-boot JPA,那么你可以简单地添加这个注解:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

当持久化层没有一个选项来为实体的主键生成/创建值时,这个问题就出现了。
您可以查看GenerationType的java文档

相关问题