Johan,
If I understand your issue correctly, you can try this:
Assuming you have an instance of DomesticCat [extends Cat] already loaded, and it is of type Cat, but the actual subclass is DomesticCat. You can re-load it using the correct subclass and you'll get a second proxy of the right type:
Code:
// cat loaded previously
DomesticCat dc = (DomesticCat) session.load(DomesticCat.class, cat.getId());
Now you have two instances pointed at the same row; note that == will not work! But that should not matter because you're using business equality, right? :)
-Chris