Помогите с отображением внешнего ключа в Hibernate (Spring)? - PullRequest
1 голос
/ 16 февраля 2010

У меня есть следующие две таблицы (которые связаны с безопасностью Spring - но я считаю, что проблема связана с Hibernate):

Table user
Table authority

Таблица user привязана (через Hibernate) к объекту домена в моем приложении: class User, который имеет следующие атрибуты (и соответствующие методы получения и установки), которые соответствуют столбцам в таблице user ( кроме коллекции, которая будет объяснена позже):

long uId
String username
String password
...
Collection<GrantedAuthority> authorities

Таблица authority имеет 2 столбца: UserId (внешний ключ в таблице user) и Authority (например, "ROLE_USER"). Эта таблица НЕ представлена ​​как объект домена, а просто является коллекцией в классе User.

Чтобы создать отображение, в моем файле .hbm я использую следующее:

<class name="com.business.project.domain.User" table="user">
    <id name="uId" column="UserId"></id>
    <property name="username" column="Name" type="java.lang.String" />
    <property name="password" column="Password" type="java.lang.String" />
    ...
    <set name="authorities" table="authority">
        <key column="UserId" />
        <element column="Authority" type="java.lang.String" />
    </set>
</class>

В моей реализации DAO в спящем режиме я создаю объект запроса, выполняю запрос и преобразовываю результат в объект User:

...
Query query = session.createQuery("from User where name = :username");
...
User user = (User) query.uniqueResult();

В этот момент я ожидал бы, что этот объект будет заполнен данными, которые он извлекает из БД (я убедился, что таблицы заполнены правильно тестовыми данными и имена отображений верны в файле отображения).

Однако, вызывая методы getter для различных атрибутов объекта user, все возвращают NULL по некоторым причинам. Может кто-то сразу увидеть что-то не так с моей настройкой? Возможно, я неправильно сопоставил коллекцию (с отношением внешнего ключа)? СПАСИБО!

Обновление : вот SQL-запрос, сгенерированный в спящем режиме (взятый из его вывода DEBUG):

Hibernate: select user0_.UserId as UserId1_, user0_.Name as Name1_, 
  user0_.Password as Password1_ from user user0_ where user0_.Name=?

По какой-то причине он не показывает ничего, связанного с таблицей authority ... означает ли это, что мое отображение неверно?

Редактировать : По совету Божо, я посмотрел на сообщения на консоли при запуске (tomcat), но не увидел ничего необычного:

Feb 16, 2010 10:35:12 AM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: com.me.project.domain.User -> user
Feb 16, 2010 10:35:12 AM org.hibernate.cfg.HbmBinder bindCollection
INFO: Mapping collection: com.me.project.domain.User.authorities -> authority

Ответы [ 4 ]

0 голосов
/ 17 февраля 2010

«Пароль» обычно является ключевым словом в базах данных. Кажется, вы столкнулись с проблемой столкновения имен. Попробуйте следующее. Поставьте галочку вокруг имени столбца, чтобы убежать.

<property name="username" column="`Name`" type="java.lang.String" />
<property name="password" column="`Password`" type="java.lang.String" />

Предположим, что вы используете org.springframework.security.GrantedAuthority, тогда ваше сопоставление для полномочий неверно Основываясь на способе отображения, при доступе к коллекции вы, скорее всего, получите исключение ClassCastException. Вы, вероятно, хотите использовать что-то вроде UerType, чтобы избежать проблемы.

0 голосов
/ 16 февраля 2010
Query query = session.craeteQuery("FROM User WHERE username = :username");
query.setString("username", "SomeUserName");

Это должно в значительной степени сделать это.

0 голосов
/ 16 февраля 2010

Вы очищаете базу данных каждый раз, когда запускаете тестовый / Java-код? В hibernate есть параметр, и когда он включен, он может очищать базу данных каждый раз, когда выполняется тестовый / Java-код.

Можете ли вы найти findAll () и напечатать размер? Я очень подозреваю, что это неправильная БД, или нет данных в БД или очистке данных.

ПРИМЕЧАНИЕ. Проверьте наличие свойства hibernate.hbm2ddl.auto в файле конфигурации. Если он установлен в «create-drop», hibernate автоматически создаст схему при запуске и удалит схему при выключении виртуальной машины. Просто укажите «обновить» или что-то

http://docs.atlassian.com/hibernate2/2.1.8/reference/session-configuration.html

0 голосов
/ 16 февраля 2010

Попробуйте с "from User where username = :username"

HQL использует свойства класса, а не имена столбцов db

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...