Най-големият ви проблем е неправилната колона в <key>
mapping - трябва да бъде "user_id", а не "id". Въпреки това цялото ви картографиране ми изглежда малко странно.
На първо място, ако искате автоматично генерирани идентификационни номера, наистина трябва да оставите Hibernate да се погрижи за това, като посочите подходящ генератор:
<id column="id" name="id"> <generator class="native"/> </id>
Прочетете Документацията за хибернация на генератори за различни налични опции.
Второ, ако всичко, от което се нуждаете, е набор от типове низове, помислете за повторното им съпоставяне в колекция от елементи, а не във връзка един към много:
<set name="types" table="types"> <key column="user_id"/> <element column="type" type="string"/> </set>
По този начин няма да имате нужда от изричен клас "Типове" или съпоставяне за него. Дори ако искате да имате допълнителни атрибути на "Типове", все пак можете да го картографирате като компонент, а не като обект.
И накрая, ако „Типове“ трябва да е обект поради някакво изискване, което не сте описали, връзката между „Потребители“ и „Типове“ е двупосочна и трябва да бъде картографирана като такава:
<set name="types" table="types" inverse="true"> <key column="user_id"/> <one-to-many class="Types"/> </set> ... in Types mapping: <many-to-one name="user" column="user_id" not-null="true"/>
В последния случай „Types“ ще трябва да има свойство „user“ от тип „Users“.Тук е подробен пример.