2

クラスを次のようにマッピングしました(IDのみが重要であるため、他のフィールドは省略しています)。

@Entity
@Table(name = "MODEL_GROUP")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class SettlementModelGroup implements Serializable
{


@Id
@GeneratedValue(generator = "MODEL_GROUP_SEQ", strategy = GenerationType.SEQUENCE)
@GenericGenerator(name = "MODEL_GROUP_SEQ",
        strategy = "sequence",
        parameters = @Parameter(name = "sequence", value = "SEQ_MODEL_GROUP_MODEL_GROUP_ID"))
@Column(name = "MODEL_GROUP_ID", nullable = false)
private Integer modelId;
}

新しいオブジェクトを保存するとき:

Integer modelGroupId = sessionFactory.getCurrentSession().save( modelGroup );
System.out.println( modelGroupId );

IDは例えばのように設定されて23いますが、データベースを見ると実際は24です。後でこのIDを使用するため、これは多くの問題を引き起こします。なぜそれがこのギャップを作っているのか考えていますか?

SQLログはすべてが正常であることを示しています(私はそう思います):

Hibernate: 
 select
     SEQ_MODEL_GROUP_MODEL_GROUP_ID.nextval 
 from
     dual
Hibernate: 
 insert 
 into
     MODEL_GROUP
     (DOMAIN_ID, DESCRIPTION, NAME, PERIOD_TYPE_ID, MODEL_GROUP_TYPE_ID, STATUS_ID, OWNER_ID, MODEL_GROUP_ID) 
 values
     (?, ?, ?, ?, ?, ?, ?, ?)

トリガーとシーケンス:

CREATE SEQUENCE "SEQ_MODEL_GROUP_MODEL_GROUP_ID" 
  INCREMENT BY 1 
  START WITH 1 
  NOMAXVALUE 
  MINVALUE 1 
 NOCYCLE 
 NOCACHE 
 NOORDER
;

CREATE OR REPLACE TRIGGER "TRG_MODEL_GROUP_MODEL_GROUP_ID" 
BEFORE INSERT 
ON "MODEL_GROUP" 
FOR EACH ROW 
WHEN (NEW."MODEL_GROUP_ID" is NULL)
BEGIN 
    SELECT "SEQ_MODEL_GROUP_MODEL_GROUP_ID".NEXTVAL 
    INTO :NEW."MODEL_GROUP_ID" 
    FROM DUAL; 
END;
4

1 に答える 1

1

どうやら、HibernateがデータベースにIDのnextValueを要求すると、Triggerも起動します。したがって、IDを要求すると番号23が表示されますが、実際にトランザクションをコミットしてデータベースに保存すると、IDが再び増加するため、取得し24ます。解決策はここで説明されています:

シーケンスからIDを生成するためのOracleTriggerのHIbernateの問題

正しく機能させるために、トリガーを変更しました。

CREATE OR REPLACE TRIGGER "TRG_MODEL_GROUP_MODEL_GROUP_ID" 
BEFORE INSERT 
ON "MODEL_GROUP" 
FOR EACH ROW 
WHEN (NEW."MODEL_GROUP_ID" is NULL)
BEGIN 
    SELECT "SEQ_MODEL_GROUP_MODEL_GROUP_ID".NEXTVAL 
    INTO :NEW."MODEL_GROUP_ID" 
    FROM DUAL; 
END;
于 2012-07-27T21:21:03.670 に答える