Может на самом деле что-то вроде этого:
<class name="User" table="users">
<id name="username" column="user_name"/>
<property name="password" column="user_pass" not-null="true"/>
<set name="roles" table="user_roles">
<key column="user_name"/>
<element type="string" column="role_name" />
</set>
</class>
Это сопоставит роли с коллекцией в классе User и будет примерно соответствовать схеме, которую вы дали. Хотя он не будет генерировать первичный ключ по столбцам в user_roles
.
Как правило, вы получите лучшие результаты от Hibernate с более нормализованными схемами. Например, в этом случае у вас нет таблицы для самих ролей; но то, что вы, похоже, описываете, вполне естественно было бы смоделировать как класс User и Role с отношением «многие ко многим» между ними. Примерно так:
<class name="User" table="users">
<id name="username" column="user_name"/>
<property name="password" column="user_pass" not-null="true"/>
<set name="roles" table="user_roles">
<key column="user_name"/>
<many-to-many column="role_name" class="Role"/>
</set>
</class>
<class name="Role" table="roles">
<id name="name" column="role_name"/>
</class>
Теперь это создаст схему с таблицами users
, roles
и user_roles
, и теперь user_roles
будет иметь первичный ключ в столбце имени пользователя и имени роли. Теперь вам также есть куда повесить дополнительную информацию о ролях, например описания.
Кроме того, ошибка, которую вы публикуете, - это ClassNotFoundException, что вряд ли является реальной проблемой с вашим отображением как таковым.
Вы можете сделать это с помощью составного идентификатора, если нужно, но я бы сказал, что это груз боли, который вы просто не хотите испытывать из-за чего-то такого простого.