2015-03-01 2 views
2

Я пытаюсь достичь ленивой нагрузки на следующее.Странное поведение на индивидуальном и много-одно (уникальное = истинное) выборка в спящем режиме

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.

ответ

0

Выяснилось решение некоторое время назад, но забудьте его опубликовать.

Вышеупомянутая проблема - 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" />