No, this is allowed. I just tested this mapping:
Code:
<class name="org.hibernate.test.A" discriminator-value="0" lazy="true">
<id name="id" column="identifier_column" unsaved-value = "null">
<generator class="increment"/>
</id>
<discriminator column="clazz_discriminata" type="integer" force="true" not-null="false"/>
<property name="name"/>
<many-to-one name="forward" class="org.hibernate.test.E" cascade="save-update" />
<subclass name="org.hibernate.test.B" discriminator-value="null" lazy="true">
<property name="count" column="count_"/>
<map name="map">
<key column="BID"/>
<index column="MAPKEY" type="string"/>
<element column="MAPVAL" type="int"/>
</map>
<subclass name="org.hibernate.test.C1" discriminator-value="1" lazy="true">
<property name="address" column="c1"/>
<one-to-one name="d"/>
<many-to-one name="c2" column="c" class="org.hibernate.test.C2"/>
<bag name="c2s" inverse="true" where="clazz_discriminata=2">
<key column="c"/>
<one-to-many class="org.hibernate.test.C2"/>
</bag>
</subclass>
<subclass name="org.hibernate.test.C2" discriminator-value="2" lazy="true">
<property name="address" column="c2"/>
<many-to-one name="c1" column="c" class="org.hibernate.test.C1"/>
<bag name="c1s" inverse="true" where="clazz_discriminata=1">
<key column="c"/>
<one-to-many class="org.hibernate.test.C1"/>
</bag>
</subclass>
</subclass>
</class>
And it worked perfectly for the following test:
Code:
public void testSharedColumn() throws Exception {
Session s = openSession();
Transaction t = s.beginTransaction();
C1 c1 = new C1();
C2 c2 = new C2();
c1.setC2(c2);
c2.setC1(c1);
s.save(c1); s.save(c2);
t.commit();
s.close();
s = openSession();
t = s.beginTransaction();
List list = s.find("from B");
assertTrue( list.size()==2 );
t.commit();
s.close();
s = openSession();
t = s.beginTransaction();
c1 = (C1) s.createQuery("from C1").uniqueResult();
c2 = (C2) s.createQuery("from C2").uniqueResult();
assertTrue( c1.getC2()==c2 );
assertTrue( c2.getC1()==c1 );
assertTrue( c1.getC2s().contains(c2) );
assertTrue( c2.getC1s().contains(c1) );
t.commit();
s.close();
s = openSession();
t = s.beginTransaction();
c1 = (C1) s.get( A.class, c1.getId() );
c2 = (C2) s.get( A.class, c2.getId() );
assertTrue( c1.getC2()==c2 );
assertTrue( c2.getC1()==c1 );
assertTrue( c1.getC2s().contains(c2) );
assertTrue( c2.getC1s().contains(c1) );
t.commit();
s.close();
s = openSession();
t = s.beginTransaction();
s.delete(c1); s.delete(c2);
t.commit();
s.close();
}
So thats not the problem!