J'utilise SQL Server 2012 Express Edition avec le dialoque hibernate SQLServer2008Dialect
pour exécuter la démo Admin et avoir quelques problèmes avec la génération de clé primaire. L'instruction d'insertion initiale n'utilise pas les valeurs pré-calculées de 'SEQUENCE_GENERATOR'
pour le champ @Id
.L'insertion d'une nouvelle entité ne regarde pas 'SEQUENCE_GENERATOR' - administrateur de démo
@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;
Lorsque vous essayez d'insérer un contenu structuré, table 'SEQUENCE_GENERATOR'
obtient des valeurs peuplées:
SELECT * FROM dbo.SEQUENCE_GENERATOR
ID_NAME ID_VAL
--------------------------- --------------------
SandBoxImpl 101
StructuredContentFieldImpl 101
StructuredContentImpl 101
Mais la nouvelle entité est enregistrée avec l'identifiant de 1 (il y a quelques lignes existantes déjà dans ce tableau comme par démonstration de script 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
le SQL suivant apparaît dans la console lors de l'insertion de cette ligne:
[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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Plus tard sur l'enregistrement du contenu HTML dans le BLC_SC_FLD
n'est pas si chanceux. La nouvelle entité obtient également attribué l'id de 1, qui existe malheureusement déjà:
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
et bien sûr l'exception est levée:
[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).
Je ne sais pas où est le problème. La stratégie de génération @GenericGenerator
org.broadleafcommerce.common.persistence.IdOverrideTableGenerator
semble atteindre 'SEQUENCE_GENERATOR'
lors de la première insertion, puis incrémente l'ID de la variable FIELD_CACHE
comme conçu.
J'ai donc 2 questions.
- Pourquoi
'SEQUENCE_GENERATOR'
obtient les valeurs initiales de 101, alors qu'il y a déjà un identifiant supérieur enregistré dans la table? - Pourquoi l'entité est enregistrée avec la valeur 1? Est-ce que MS SQL Server est lié?