Невозможно получить ребенка один на один, используя конфигурацию hbm.xml

У меня есть две таблицы: одна - Пользователь, а другая - Сотрудник.

Пользователь:

public class User {

    private int id;

    private String userName;

    private String password;

    private Employee employee;

    // Getter and setter
}

User.hbm.xml:

<hibernate-mapping>
    <class name="com.site.dto.User" table="user">

        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="userName" type="string">
            <column name="user_name" length="50" not-null="true" unique="true" />
        </property>

        <property name="password" type="string">
            <column name="password" length="50" not-null="true" unique="true" />
        </property>

        <one-to-one name="employee" class="com.site.dto.Employee" fetch="join" cascade="all"/>
    </class>
</hibernate-mapping>

Работник:

public class Employee implements Serializable{

    private static final long serialVersionUID = 1L;

    private int id;

    private String name;

    private User user;

    // Getter and setter

}

Employee.hbm.xml:

<hibernate-mapping>
    <class name="com.site.dto.Employee" table="employee">

        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>

        <property name="name" type="string">
            <column name="name" length="50" not-null="true" unique="true" />
        </property>

        // I'm enforcing the many-to-one to one-to-one by adding unique="true"
        <many-to-one name="user" column="user_id" class="com.site.dto.User" not-null="true" unique="true" fetch="join" cascade="all"/>      
    </class>
</hibernate-mapping>

Теперь после входа в систему, я беру таблицу пользователей

User user = userService.getCredentials(sessionDetails.getLoginUserName());
Employee employee = user.getEmployee();

Код DaoImpl:

@Transactional
public User getCredentials(String userName) {
    Criteria cr = getSession().createCriteria(User.class);
    cr.add(Restrictions.eq("userName", userName));
    return (User) cr.uniqueResult();
}

Для проверки я попробовал System.out.println(employee.getId());, но он возвращал ноль. Infact, а не прямо как NULL, как исключение Null Pointer, что означает, что это NULL. Я пытался изменить типы выборки, но не могу получить объект сотрудника. Для дальнейшей проверки, я как минимум получаю объект пользователя, я получаю ожидаемый идентификатор пользователя, когда sysout user.getId();

Вчера у меня было все сопоставление в hibernate-аннотации вместо hbm.xml. В то время я поместил аннотацию @One-to-One как для пользователя, так и для сотрудника, и она работала успешно. Но сегодня я изменил все на hbm.xml, и проблема возникает.

0 ответов

Другие вопросы по тегам