Странное поведение при выборке "один-к-одному" и "многие-к-одному" (уникальное = истинное) в спящем режиме

Я пытаюсь добиться ленивой нагрузки на следующее.

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" />
Другие вопросы по тегам