Невозможно получить ребенка один на один, используя конфигурацию 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, и проблема возникает.