我将 Hibernate Tools 3.2.1.GA 与 Spring 版本 3.0.2 一起使用。我正在尝试将最后插入的行的 id 检索到 Oracle(10g) 数据库中,如下所示。
Session session=NewHibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Country c=new Country();
c.setCountryId(new BigDecimal(0));
c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);
session.flush();
System.out.println(c.getCountryId());
session.getTransaction().commit();
在数据被序列化到数据库之后并且在事务提交之前,该语句System.out.println(c.getCountryId());
预计会返回当前插入的 id,但它不会因为前面代码片段中的以下行(因为它可能在我看来)。
c.setCountryId(new BigDecimal(0));
我不确定为什么在我的情况下需要此语句(插入时)。我在任何地方都没有看到这个声明。省略此行会导致引发以下异常。
org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:model.Country
c.setCountryId(new BigDecimal(0));
在插入过程中真的需要这个语句吗?它是 Oracle 数据库中序列生成的主键,由于该行,此语句System.out.println(c.getCountryId());
始终返回0
实际预期返回当前会话中当前插入的 id。
那么,在这种情况下如何获取最后生成的 id 呢?我是不是走错了路,有不同的方法吗?
编辑:
CREATE TABLE "COUNTRY"
(
"COUNTRY_ID" NUMBER(35,0) NOT NULL ENABLE,
"COUNTRY_CODE" VARCHAR2(10),
"COUNTRY_NAME" VARCHAR2(50),
"ZONE_ID" NUMBER(35,0),
CONSTRAINT "COUNTRY_PK" PRIMARY KEY ("COUNTRY_ID") ENABLE,
CONSTRAINT "COUNTRY_FK" FOREIGN KEY ("ZONE_ID")
REFERENCES "ZONE" ("ZONE_ID") ON DELETE CASCADE ENABLE
)
/
CREATE OR REPLACE TRIGGER "BI_COUNTRY"
before insert on "COUNTRY"
for each row
begin
select "COUNTRY_SEQ".nextval into :NEW.COUNTRY_ID from dual;
end;
/
ALTER TRIGGER "BI_COUNTRY" ENABLE
/