1

COUNTRY_IDOracle (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>

ここで何が欠けていますか?

4

1 に答える 1

0

COUNTRY実際、シーケンスを主キー列に関連付けるために Oracle GUI ツールによって自動的に作成されたテーブルに対するトリガーがありましたCOUNTRY_ID

シーケンスは、Hibernate によって 1 回、トリガーによって 2 回実行されていました。トリガーを一時的に無効にすると、アプローチは意図したとおりに機能しました。

于 2014-10-09T18:48:29.040 に答える