Hibernate插入数据遇ORA-01400/ORA-02289错误咨询
让我们一步步拆解你的问题,这两个错误其实是关联的,先搞清楚核心原因:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update&ORA-02289: sequence does not exist
ORA-01400: cannot insert NULL into ("SYSTEM"."CUSTOMER"."CUSTOMERID")
第一个错误ORA-01400是因为你的数据库表CUSTOMER的CUSTOMERID字段设置了非空约束,但你在代码里创建Customer对象时没有给这个字段赋值,也没配置Hibernate自动生成ID;第二个ORA-02289则是因为你可能在Hibernate配置里指定了用序列生成ID,但数据库中对应的序列根本不存在。
下面给你两种针对性的解决方案,根据你的业务需求选择:
方案1:手动指定CustomerId
如果你的业务需要手动控制customerId的值,直接在客户端代码中给对象设置ID即可:
修改InsertCustomer的main方法:
public static void main(String[] args) { Configuration config=new Configuration(); config.configure("com/sathya/config/hibernate.cfg.xml"); SessionFactory factory=config.buildSessionFactory(); Session session=factory.openSession(); Customer cust=new Customer(); // 手动设置customerId,避免NULL插入 cust.setCustomerId("C001"); cust.setCustomerName("sathya"); cust.setLocation("Hyd"); Transaction tx=session.beginTransaction(); session.save(cust); tx.commit(); session.close(); factory.close(); }
方案2:用Hibernate自动生成CustomerId(Oracle序列方式)
如果想让Hibernate自动帮你生成ID,需要做以下两步:
第一步:修改Customer实体类,添加ID生成注解
根据你使用的Hibernate版本,导入对应的注解(Hibernate 5.x用javax.persistence,Hibernate 6+用jakarta.persistence):
package com.sathya.entity; import javax.persistence.*; // 或者 jakarta.persistence.* @Entity @Table(name="CUSTOMER") public class Customer { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="cust_seq_generator") @SequenceGenerator( name="cust_seq_generator", sequenceName="CUSTOMER_ID_SEQ", // 这个是要在数据库创建的序列名 allocationSize=1 ) private Integer customerId; // 推荐用数值型ID,序列生成更顺畅 private String customerName; private String location; // 构造方法、getter、setter、toString方法保持不变 }
小提示:如果坚持用String类型的
customerId,需要额外配置字符串转换逻辑,更推荐用Integer等数值类型适配序列生成。
第二步:在Oracle数据库中创建对应的序列
执行以下SQL语句:
CREATE SEQUENCE CUSTOMER_ID_SEQ START WITH 1 INCREMENT BY 1 MAXVALUE 999999 NOCYCLE NOCACHE;
额外检查:Hibernate XML映射配置(如果不用注解)
如果你是用XML映射文件而不是注解,需要在Customer.hbm.xml中配置ID的生成策略:
<class name="com.sathya.entity.Customer" table="CUSTOMER"> <id name="customerId" type="integer"> <column name="CUSTOMERID"/> <generator class="sequence"> <param name="sequence">CUSTOMER_ID_SEQ</param> </generator> </id> <!-- 其他属性映射 --> </class>
最后验证
不管选哪种方案,修改完成后重新运行你的客户端程序,这两个错误应该就能解决了。
内容的提问来源于stack exchange,提问作者sai

