Я пытаюсь достичь ленивой нагрузки на следующее.Странное поведение на индивидуальном и много-одно (уникальное = истинное) выборка в спящем режиме
User.java
public class User {
private int id;
private String userName;
private String password;
private Employee employee;
//getter and setters
}
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" update="false">
<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="select" cascade="save-update" />
</class>
</hibernate-mapping>
Employee.java
public class Employee implements Serializable{
private int id;
private String name;
private String email;
private User user;
// getter and setters
}
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>
<property name="email" type="string" update="false">
<column name="email" length="50" not-null="true" unique="true" />
</property>
// enforcing many-to-one to one-to-one by putting unique="true"
<many-to-one name="user" column="user_id" class="com.site.dto.User" unique="true" not-null="true" fetch="select" cascade="save-update" />
</class>
</hibernate-mapping>
Сначала я получаю пользовательский объект на основе имени пользователя. Теперь я пытаюсь загрузить объект employee, который дает мне исключение null-указателя. Поэтому, после того, как вы отлаживаете некоторые отладки, кажется, что используется оператор select с неправильным предложением where. Вот это спящий режим отладки
select employee0_.id as id1_1_0_, employee0_.name as name2_1_0_, employee0_.email as email3_1_0_,employee0_.user_id as user_id25_1_0_, from employee employee0_ where employee0_.id=?
Почему где положение основано на employee.id
и не employee.user.id
? Я думаю, это связано с тем, как одно-однозначное отображение работает в конфигурации hbm.xml, где взаимно однозначный будет связан с первичным ключом дочерней таблицы id
, но не user_id
. Я заставляю «много-к-одному» к одному человеку работать с помощью unique="true"
. Я могу найти сотрудника в аннотации Hibernate один на один, указав @Join-column
, но я не могу понять, как сопоставить взаимно-однозначное соединение в hbm.xml, которое должно ссылаться на user_id
.