These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Mapper une collection avec une propriété...
PostPosted: Mon Feb 19, 2007 5:12 am 
Newbie

Joined: Mon Nov 06, 2006 5:45 am
Posts: 5
Je désire mapper une collection dans Product.hbm.xml (--> Product.java) avec une propriété naturalId différente que la clé primaire (qui ne correspond qu'à un identifiant technique)...

De plus la collection est composée d'élément qui sont mappés via un <composite-id> (Product_DopingClassification.hbm.xml --> Product_DopingClassification.java)

Dans la doc officielle, il est noté que l'on peut faire cela en mappant le SET avec la propriété souhaitée en ajoutant l'attribut <property-ref> MAIS cela ne marche pas...et lorsque je sauve le PRODUCT, l'id pris en compte est la clé primaire et NON la propriété que je désire

Hibernate version:
3.13

Mapping documents:
Product.hbm.xml
Code:
<class name="com.vidal.bo.model.product.Product" table="product">
      
      <id name="id" type="long" column="id">
         <generator class="increment"/>
         </id>
     
         <property name="naturalId" type="integer" column="product_Id"/>
[...]
                        <!-- product_dopingClassification link -->
         <set name="product_dopingClassification_set" lazy="false" cascade="all" inverse="true">
             <key column="product_id" property-ref="naturalId"/>
             <one-to-many class="com.vidal.bo.model.product.dopingProduct.Product_DopingClassification" />
          </set>
[...]

Product_DopingClassification.hbm.xml
Code:
<hibernate-mapping>
   <class name="com.vidal.bo.model.product.dopingProduct.Product_DopingClassification" table="product_dopingClassification">
      
      <composite-id>
         <key-many-to-one name="product" class="com.vidal.bo.model.product.Product" column="product_Id" lazy="false"/>
          <key-many-to-one name="dopingClassification" class="com.vidal.bo.model.dictionary.molecule.dopingMolecule.DopingClassification" column="dopingClassification_Id" lazy="false" />
         <key-many-to-one name="versionIn" class="com.vidal.bo.model.versioning.domain.EntityVersion" column="vIn" lazy="false"/>
      </composite-id>
      
      <property name="isValid" type="true_false" column="isValid" />
      
      <!-- many-to-one name="versionIn" column="vIn" class="com.vidal.bo.model.versioning.domain.EntityVersion"/ -->
        <many-to-one name="versionOut" column="vOut" class="com.vidal.bo.model.versioning.domain.EntityVersion"/>

   </class>
</hibernate-mapping>



Code between sessionFactory.openSession() and session.close():
Code:
Product product = new Product();
      product.setName("product name NIASPAN in Version 1");
      Product_DopingClassification productDopingClassification = new Product_DopingClassification();
      productDopingClassification.setProduct(product);
      productDopingClassification.setDopingClassification(currentEntitiesDopingClassification.get(0));
      product.getProduct_dopingClassification_set().add(productDopingClassification);
      productDao.saveOrUpdate(product);


Full stack trace of any exception that occurs:

No explicite error but the value in product_id column in product_dopingClassification table is value of the primary key id and not the naturalId value


Name and version of the database you are using:
HSQLDB

The generated SQL (show_sql=true):

Hibernate:
insert
into
product
(product_Id, vIn, vOut, name, shortName, veryShortName, spcProductName, spcFolderNumber, spcPosology, spcInternalId, cis, isUnmarket, productDataSempProductionId, maximumDeliveryDuration, pharmacyClassificationRootCode, ranking, pharmacokineticComment, spectrumComment, incompatibilityComment, pharmacodynamicComment, modalityHandlingComment, preclinicalSafetyComment, country_id, productLine_id, pharmacyClassification_id, usefullComplement_id, tasteComplement_id, formComplement_id, composantComplement_id, commonNameGroup_id, form_id, list_id, dosage_id, procedureType_id, id)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
product_dopingClassification
(isValid, vOut, product_Id, dopingClassification_Id, vIn)
values
(?, ?, ?, ?, ?)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Feb 20, 2007 5:39 am 
Newbie

Joined: Mon Nov 06, 2006 5:45 am
Posts: 5
Je répond moi même...
En fait, comme cela est spécifié dans la doc officielle, pour mapper une collection avec une propriété de la classe et non la clé primaire, il est nécessaire d'utiliser l'attribut <property-ref> de <key> (pour mapper la collection product_dopingClassification_set)...MAIS lorsque le mapping de l'entité contenue dans la collection est composée d'un <composite-id>, il est aussi nécessaire d'ajouter l'attribut <property-ref> à <key-many-to-one> du parent (ici Product)

Mais la DTD ne permet pas d'ajouter l'attribut <property-ref> à <key-many-to-one> alors que le code le pemet (cf : http://forum.hibernate.org/viewtopic.ph ... ropertyref)

Ainsi, j'ai été obligé de modifer la DTD ;(

Product.hbm.xml (parent)
Code:
<hibernate-mapping>
    
     <class name="com.vidal.bo.model.product.Product" table="product">
      
      <id name="id" type="long" column="Id">
         <generator class="increment"/>
      </id>
         
         <property name="naturalId" column="product_Id" type="integer"/>    

[...]

<set name="product_dopingClassification_set" lazy="false" cascade="save-update" inverse="true">
             <key  property-ref="naturalId">
                <column name="product_Id" not-null="true" />
             </key>        
             <one-to-many class="com.vidal.bo.model.product.dopingProduct.Product_DopingClassification"/>
          </set>   


Product_DopingClassification.hbm.xml

Code:
<hibernate-mapping>
   <class
      name="com.vidal.bo.model.product.dopingProduct.Product_DopingClassification"
      table="product_dopingClassification">
      
      <composite-id>
         <key-many-to-one name="product" class="com.vidal.bo.model.product.Product" column="product_Id" property-ref="naturalId" />
          <key-many-to-one name="dopingClassification" class="com.vidal.bo.model.dictionary.molecule.dopingMolecule.DopingClassification" column="dopingClassification_Id" lazy="false" />
         <key-many-to-one name="versionIn" class="com.vidal.bo.model.versioning.domain.EntityVersion" column="vIn" lazy="false"/>
      </composite-id>
      
      <property name="isValid" type="true_false" column="isValid" />
      <many-to-one name="versionOut" column="vOut" class="com.vidal.bo.model.versioning.domain.EntityVersion"/>
   </class>
</hibernate-mapping>


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.