1

SQL Server 2012 Express Edition とハイバネートSQLServer2008Dialectダイアレクトを使用して管理デモを実行していますが、主キーの生成に問題があります。'SEQUENCE_GENERATOR'最初の挿入ステートメントは、@Idフィールドの事前に計算された値を使用しません。

@Id
@GeneratedValue(generator = "StructuredContentFieldId")
@GenericGenerator(
    name="StructuredContentFieldId",
    strategy="org.broadleafcommerce.common.persistence.IdOverrideTableGenerator",
    parameters = {
        @Parameter(name="segment_value", value="StructuredContentFieldImpl"),
        @Parameter(name="entity_name", value="org.broadleafcommerce.cms.structure.domain.StructuredContentFieldImpl")
    }
)
@Column(name = "SC_FLD_ID")
protected Long id;

新しい構造化コンテンツを挿入しようとすると、'SEQUENCE_GENERATOR'テーブルにいくつかの値が入力されます:

SELECT * FROM dbo.SEQUENCE_GENERATOR

ID_NAME                     ID_VAL
--------------------------- --------------------
SandBoxImpl                 101
StructuredContentFieldImpl  101
StructuredContentImpl       101

ただし、新しいエンティティは ID 1 で保存されます (デモ SQL スクリプトに従って、このテーブルには既にいくつかの既存の行があります)。

SELECT SC_ID, CONTENT_NAME, SC_TYPE_ID FROM dbo.BLC_SC

SC_ID                CONTENT_NAME                               SC_TYPE_ID
-------------------- ------------------------------------------ --------------------
1                    html test                                  2
100                  Buy One Get One - Twice the Burn           1
[...]
156                  Home Page Featured Products Title          3

その行を挿入すると、次の SQL がコンソールに表示されます。

[artifact:mvn] Hibernate: select tbl.ID_VAL from SEQUENCE_GENERATOR tbl with (updlock, rowlock ) where tbl.ID_NAME=?
[artifact:mvn] Hibernate: update SEQUENCE_GENERATOR set ID_VAL=?  where ID_VAL=? and ID_NAME=?
[artifact:mvn] Hibernate: insert into BLC_SC (ARCHIVED_FLAG, CREATED_BY, DATE_CREATED, DATE_UPDATED, UPDATED_BY, CONTENT_NAME, DELETED_FLAG, LOCALE_CODE, LOCKED_FLAG, OFFLINE_FLAG, ORIG_ITEM_ID, ORIG_SANDBOX_ID, PRIORITY, SANDBOX_ID, SC_TYPE_ID, SC_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

後でいくつかの HTML コンテンツを に保存することBLC_SC_FLDは、それほど幸運ではありません。新しいエンティティにも 1 の ID が割り当てられますが、これは残念ながら既に存在しています。

SELECT SC_FLD_ID, FLD_KEY, VALUE, SC_ID FROM dbo.BLC_SC_FLD    

SC_FLD_ID     FLD_KEY       VALUE                                         SC_ID
------------- ------------- --------------------------------------------- --------
1             imageUrl      /img/banners/buy-one-get-one-home-banner.jpg  100

もちろん、例外がスローされます。

[artifact:mvn] Hibernate: update SEQUENCE_GENERATOR set ID_VAL=?  where ID_VAL=? and ID_NAME=?      
[artifact:mvn] Hibernate: insert into BLC_SC_FLD (CREATED_BY, DATE_CREATED, DATE_UPDATED, UPDATED_BY, FLD_KEY, LOB_VALUE, VALUE, SC_ID, SC_FLD_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
[artifact:mvn] 2014-05-06 00:58:02.191:WARN:oejs.ServletHandler:/admin/structured-content/1
[artifact:mvn] org.springframework.dao.DataIntegrityViolationException: Violation of PRIMARY KEY constraint 'PK__BLC_SC_F__8A534C1863E06FD9'. Cannot insert duplicate key in object 'dbo.BLC_SC_FLD'. The duplicate key value is (1).; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Violation of PRIMARY KEY constraint 'PK__BLC_SC_F__8A534C1863E06FD9'. Cannot insert duplicate key in object 'dbo.BLC_SC_FLD'. The duplicate key value is (1).

どこに問題があるのか​​ わかりません。@GenericGenerator生成戦略は、最初の挿入でorg.broadleafcommerce.common.persistence.IdOverrideTableGeneratorヒットしたようで、設計どおりに変数'SEQUENCE_GENERATOR'から id を増やします。FIELD_CACHE

だから私は実際に2つの質問があります。

  1. テーブルに保存されているより高い ID が既にあるのに、なぜ'SEQUENCE_GENERATOR'101 の初期値を取得するのですか?
  2. エンティティが値 1 で保存されているのはなぜですか? これは MS SQL Server に関連していますか?
4

1 に答える 1

1

わかりました:) Broadleaf には 3 つの永続ユニットがあり、デフォルトでは同じデータベースを指しますがblPU、デモの開始時に 1 つの () 永続ユニットのみが sql をインポートします。

したがって、これを行うことによって:

blPU.hibernate.hbm2ddl.auto=create-drop
blCMSStorage.hibernate.hbm2ddl.auto=create-drop
blSecurePU.hibernate.hbm2ddl.auto=create-drop

SEQUENCE_GENERATOR他の永続化ユニットによって削除され、再作成されるようにしました。

これはうまくいきます:

blPU.hibernate.hbm2ddl.auto=create-drop
blCMSStorage.hibernate.hbm2ddl.auto=update
blSecurePU.hibernate.hbm2ddl.auto=update

ドゥー!

于 2014-05-06T03:13:32.933 に答える