2014-05-06 3 views
1

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 @GenericGeneratororg.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.

  1. Pourquoi 'SEQUENCE_GENERATOR' obtient les valeurs initiales de 101, alors qu'il y a déjà un identifiant supérieur enregistré dans la table?
  2. Pourquoi l'entité est enregistrée avec la valeur 1? Est-ce que MS SQL Server est lié?

Répondre

1

Ok résolu :) Feuillu dispose de 3 unités de persistance, et par défaut, ils pointent vers la même base de données, mais un seul (blPU) les importations de l'unité persistance sql au début de la démo.

Donc en faisant ceci:

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

Je fis la SEQUENCE_GENERATOR à vide supprimée et recréée par une autre unité de persistance en ligne.

Cela fonctionne très bien:

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

Dooh!

Questions connexes