COUNTRY_ID
Oracle (10g) データベースのCOUNTRY
テーブルの主キー列に対して生成されたシーケンス値をフェッチしようとする次のコードがあります。
Country c=new Country();
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();
//session.refresh(c);
System.out.println(c.getCountryId()); //Attempts to display the sequence value.
session.getTransaction().commit();
このコード内のこのステートメントSystem.out.println(c.getCountryId());
は、挿入が完了した後、現在生成されているシーケンス値を表示しようとします。
Oracle テーブルで生成されたシーケンス値は、 414、415、416、417、418、419、420 のようなチェーンに挿入されるのではなく、 2 の倍数、つまりこの 414、416、418、420... のように挿入されます。 ..
Oracle テーブルに現在挿入されているシーケンス値が であるとします。このステートメントは426
、このステートメントSystem.out.println(c.getCountryId());
を示しています425
(一方COUNTRY_ID
、Oracle テーブルの列では、挿入された値は です426
)。
おそらく、何らかの理由でシーケンスが 2 回実行されているように見えます。
私の Hibernate POJO では、countryId
主キー列を次のように指定しました。
@Id
@Column(name = "COUNTRY_ID")
@SequenceGenerator(name = "CountryIdSequence", sequenceName = "COUNTRY_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CountryIdSequence")
private long countryId;
Country.hbm.xml
マッピング ファイルでは、この列はcountryId
次のようにマッピングされます。
<id name="countryId" type="long">
<column name="COUNTRY_ID" precision="35" scale="0"/>
<generator class="sequence">
<param name="sequence">COUNTRY_SEQ</param>
</generator>
</id>
ここで何が欠けていますか?