Spring バージョン 3.0.2 で Hibernate Tools 3.2.1.GA を使用しています。次のように、最後に挿入された行の 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: このクラスの ID は、save() を呼び出す前に手動で割り当てる必要があります: 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
/