Hello, I'm migrating a project from NHibernate version 1.0.2 to version 1.2.0.
It's a Win Forms application written in c#. The database engine is Oracle 10g.
Everything is working fine except for one thing. There is a class which has two uni-directional many to many associations that are also indexed with an index column.
Here is the mapping file:
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="RTLTools.NHibernateTools.RTLFieldAccessor,RTLTools.NHibernateTools" default-lazy="false" assembly="CronosDomain" namespace="CronosDomain">
   <class name="AbstractProgram" table="T_PROGRAM">
    <cache usage="read-write"/>
    
    <id name="Id" column="ID" type="Int32" unsaved-value="0">
         <generator class="sequence">
            <param name="sequence">S_PROGRAM_ID</param>
         </generator>
      </id>
    <discriminator column="CLASS_ID" type="string"/>
    <list name="GenreForProgramList" table="T_GENRE_FOR_PROGRAM" lazy="true">
      <key column="PROGRAM_ID"/>
      <index column="POSITION" type="integer"/>
      <many-to-many class="ProgramGenre" column="PROGRAM_GENRE_ID"/>      
    </list>
    
    <list name="ProgramProductionCountryList" table="T_PROGRAM_PRODUCTION_COUNTRY" lazy="true">
      <key column="PROGRAM_ID"/>
      <index column="POSITION" type="integer"/>
      <many-to-many class="Country" column="COUNTRY_ID"/>
    </list>
    
    <bag name="SlotList" inverse="true" lazy="true" >
      <key column="PROGRAM_ID" />
      <one-to-many class="AbstractSlot" />
    </bag>
    
    <property column="EXTERNAL_ID" type="String" name="ExternalId" length="50" />
    <property column="LOGICAL_DELETE_DATE_TIME" type="DateTime" name="LogicalDeleteDateTime" />
    <property column="NAME" type="String" name="Name" not-null="true" length="50" />
    <many-to-one column="PROGRAM_NATURE_ID" name="ProgramNature" class="ProgramNature" />
    <many-to-one column="PROGRAM_RATING_ID" name="ProgramRating" class="ProgramRating" />
    <property column="ORIGINAL_TITLE" type="String" name="OriginalTitle" length="100" />
    <property column="LOCAL_TITLE" type="String" name="LocalTitle" length="100" />
    <property column="THEORETICAL_DURATION_IN_FRAMES" type="RTLTools.NHibernateTools.TimeSpanAsFramesType, RTLTools.NHibernateTools" name="TheoreticalDuration" />
    <property column="START_PRODUCTION_YEAR" type="Int32" name="StartProductionYear" />
    <property column="END_PRODUCTION_YEAR" type="Int32" name="EndProductionYear" />
    <property column="IS_UNBROADCAST" type="Boolean" name="IsUnbroadcast" not-null="true" />
    <subclass name="Series" discriminator-value="1">
      <bag name="SeasonList" inverse="true" lazy="true" cascade="all">
        <key column="CONTAINING_SERIES_ID" />
        <one-to-many class="Season" />
      </bag>
    </subclass>
    <subclass name="Season" discriminator-value="2">
      <many-to-one column="CONTAINING_SERIES_ID" name="ContainingSeries" class="Series" />
      <property column="SEASON_NUMBER" type="Int32" name="SeasonNumber" />
      <bag name="EpisodeList" inverse="true" lazy="true" cascade="all">
        <key column="CONTAINING_SEASON_ID" />
        <one-to-many class="Episode" />
      </bag>
    </subclass>
    <subclass name="AbstractBroadcastableProgram">
      <bag name="ContractLineList" inverse="true" lazy="true" >
        <key column="PROGRAM_ID" />
        <one-to-many class="ContractLine" />
      </bag>
      <bag name="ProgramVersionList" inverse="true" lazy="true" cascade="all">
        <key column="CONTAINING_BC_PROGRAM_ID" />
        <one-to-many class="ProgramVersion" />
      </bag>
      <bag name="ContractLineWithRightList" inverse="true" lazy="true" >
        <key column="PROGRAM_ID" />
        <one-to-many class="ContractLineWithRight" />
      </bag>
      <subclass name="Episode" discriminator-value="3">
        <many-to-one column="CONTAINING_SEASON_ID" name="ContainingSeason" class="Season" />
        <property column="EPISODE_NUMBER" type="Int32" name="EpisodeNumber" />
        <property column="SEQUENCE_NUMBER" type="Int32" name="SequenceNumber" />
      </subclass>
      <subclass name="StandaloneProgram" discriminator-value="4"/>       
      
    </subclass>
   </class>
</hibernate-mapping>
The problem occurs when a search on the project object is done with the two many to many related objects given as criteria.
The query output of NHibernate:
Code:
SELECT *
  FROM (SELECT   this_.ID AS id45_2_, this_.external_id AS external3_45_2_,
                 this_.logical_delete_date_time AS logical4_45_2_,
                 this_.NAME AS name45_2_,
                 this_.program_nature_id AS program6_45_2_,
                 this_.program_rating_id AS program7_45_2_,
                 this_.original_title AS original8_45_2_,
                 this_.local_title AS local9_45_2_,
                 this_.theoretical_duration_in_frames AS theoret10_45_2_,
                 this_.start_production_year AS start11_45_2_,
                 this_.end_production_year AS end12_45_2_,
                 this_.is_unbroadcast AS is13_45_2_,
                 genreforpr4_.program_id AS program1___,
                 programgen1_.ID AS program2_,
                 genreforpr4_.POSITION AS position__,
                 programgen1_.ID AS id18_0_,
                 programgen1_.external_id AS external2_18_0_,
                 programgen1_.logical_delete_date_time AS logical3_18_0_,
                 programgen1_.NAME AS name18_0_,
                 programgen1_.description AS descript5_18_0_,
                 programpro6_.program_id AS program1___,
                 country2_.ID AS country2_,
                 programpro6_.POSITION AS position__, 
                 country2_.ID AS id15_1_,
                 country2_.iso_code AS iso2_15_1_,
                 country2_.NAME AS name15_1_,
                 country2_.is_visible AS is4_15_1_
            FROM t_program this_,
                 t_genre_for_program genreforpr4_,
                 t_program_genre programgen1_,
                 t_program_production_country programpro6_,
                 t_country country2_
           WHERE this_.ID = genreforpr4_.program_id
             AND genreforpr4_.program_genre_id = programgen1_.ID
             AND this_.ID = programpro6_.program_id
             AND programpro6_.country_id = country2_.ID
             AND this_.class_id = '4'
             AND LOWER (this_.original_title) LIKE 'lord of war%'
             AND LOWER (this_.local_title) LIKE 'lord of war%'
             AND this_.start_production_year = '2005'
             AND programgen1_.ID = 326
             AND country2_.ID = 227
             AND this_.logical_delete_date_time IS NULL
        ORDER BY this_.NAME ASC)
 WHERE ROWNUM <= '1000';
As you can see there are two couples of column with identical names (program1___ and position__). So the external select can't work. I tried to find a solution to this for two days.
Does anyone have a solution to this problem?