My preference for this situation is to use separate classes and separate mappings. Use the where="" attribute of the class element. Something like this:
Code:
<class name="TableAClass1" where="col1=1">
...
<property name="Col1INTERNAL" column="col1"/>
<many-to-one name="Foo" column="col2"/>
...
</class>
<class name="TableAClass2" where="col1=2">
...
<property name="Col1INTERNAL" column="col1"/>
<many-to-one name="Bar" column="col2">
...
</class>
Note that, in order to insert new rows to table A when using this method, you need to have somewhere to store the "discriminator" value (the one in the where="??" attribute). Make this a member of the class, but have the set method do nothing, and the get method returns the "discriminator" value. This makes hibernate think that it's just another value that it needs to write to the table, but doesn't expose it to the users.
There are other ways of doing this. I've never investigated them though, because this way is easy, and the overhead is tiny: just two stub methods.