Странное поведение при выборке "один-к-одному" и "многие-к-одному" (уникальное = истинное) в спящем режиме
Я пытаюсь добиться ленивой нагрузки на следующее.
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>
Сначала я получаю объект пользователя на основе имени пользователя. Теперь я пытаюсь загрузить объект сотрудника, который дает мне исключение нулевого указателя. Так что после некоторой отладки, похоже, используется оператор 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=?
Почему предложение where основано на employee.id
и не employee.user.id
? Я думаю, что это связано с тем, как работает взаимно-однозначное сопоставление в конфигурации hbm.xml, где непосредственное сопоставление будет связано с первичным ключом дочерней таблицы. id
но нет user_id
, Я заставляю многих один к одному сотруднику, используя unique="true"
, Я могу получить сотрудника в личной аннотации Hibernate, определив @Join-column
но я не могу понять, как отобразить один-на-один в hbm.xml, который должен ссылаться на ребенка user_id
,
1 ответ
Обдумал решение некоторое время назад, но не забудьте опубликовать его.
Вышеупомянутая проблема - coz, по умолчанию взаимно-однозначное сопоставление будет реализовано для дочерней таблицы, у которой первичный ключ родительского элемента является первичным ключом дочернего элемента. Поэтому, если мы собираемся устранить это свойство по умолчанию и использовать один-к-одному со многими-к-одному (unique=true), мы должны определить property-ref
я добавил property-ref
в сопоставлении один-к-одному в User.hbm.xml и теперь он работает нормально.
<one-to-one name="employee" property-ref="user" class="com.site.dto.Employee" fetch="select" cascade="save-update" />