hibernate - набор для отображения весны / бобов - PullRequest
1 голос
/ 19 июля 2010

Я в значительной степени новичок в Spring-Hibernate, и я пытался заставить его работать.

У меня есть такая модель данных:

patient                prescription
----------             --------------
patient_id*            prescription_id*
first_name             patient_id*
last_name              date
...

Яиспользуя весенние бобы с шаблоном hibernate, чтобы определить мой сеанс / hibernatetemplate и dao следующим образом:

    <bean id="mySessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="mappingResources">
        <list>
            <value>./org/example/smartgwt/shared/model/prescription.hbm.xml</value>
            <value>./org/example/smartgwt/shared/model/patient.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <value>hibernate.dialect=org.hibernate.dialect.HSQLDialect</value>
    </property>
</bean>

<!-- Wrapper for low-level data accessing and manipulation -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
        <ref bean="mySessionFactory" />
    </property>
</bean>

<!--  -->

<bean id="patientDao" class="org.example.smartgwt.server.data.PatientDao">
    <property name="hibernateTemplate">
        <ref bean="hibernateTemplate" />
    </property>
</bean>

<bean id="prescriptionDao" class="org.example.smartgwt.server.data.PrescriptionDao">
    <property name="hibernateTemplate">
        <ref bean="hibernateTemplate" />
    </property>
</bean>

Некоторое время у меня была только таблица пациента , и все было в порядке.Но затем я решил добавить рецепт , который использует внешний ключ типа Patient_id .По сути, у меня есть 2 объекта модели POJO, таких как:

public class Patient implements Serializable {

///////////////////////////////////////////////////////////////////////////
// Data members
///////////////////////////////////////////////////////////////////////////
private static final long serialVersionUID = 1L;
private int    patientId;
private String firstName;
private String lastName;
private Date   birthDate;
private String address;
private String phone;

private Set patientPrescriptions;

public Patient() {}

public void setPatientId(int patientId) {
    this.patientId = patientId;
}

public int getPatientId() {
    return patientId;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getFirstName() {
    return firstName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getLastName() {
    return lastName;
}

public void setBirthDate(Date birthDate) {
    this.birthDate = birthDate;
}

public Date getBirthDate() {
    return birthDate;
}

public void setAddress(String address) {
    this.address = address;
}

public String getAddress() {
    return address;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public String getPhone() {
    return phone;
}

public void setPatientPrescriptions(Set patientPrescriptions) {
    this.patientPrescriptions = patientPrescriptions;
}

public Set getPatientPrescriptions() {
    return patientPrescriptions;
}
}

(похожая более простая вещь для рецепта).

То, что меня беспокоит, это приватный набор PatientPrescription член.Вот мое отображение hbm.xml для моего класса пациентов.

<hibernate-mapping>
<class name="org.example.smartgwt.shared.model.Patient" table="patient" lazy="true">
    <id name="patientId" column="patient_id">
        <generator class="increment"/>
    </id>

    <property name="firstName">
        <column name="first_name"/>
    </property>
    <property name="lastName">
        <column name="last_name"/>
    </property>
    <property name="birthDate">
        <column name="birth_date"/>
    </property>
    <property name="address">
        <column name="address"/>
    </property>
    <property name="phone">
        <column name="phone"/>
    </property>

    <set name="patientPrescriptions" cascade="all">
        <key column="patient_id"/>
        <one-to-many class="Prescription"/>
    </set>

</class>

Как только я ссылаюсь на это в моем файле отображения Patient.hbm.xml, я получаю сообщение об ошибке.

org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем «prescriptionDao», определенным в файле [C: \ eclipse \ workspace \ smart-gwt \ WebContent \ WEB-INF \ resources \ hibernate-beans.xml]: не удается разрешить ссылку на bean-компонент «hibernateTemplate»при установке свойства компонента 'hibernateTemplate';вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка создания компонента с именем 'hibernateTemplate', определенного в файле [C: \ eclipse \ workspace \ smart-gwt \ WebContent \ WEB-INF \ resources \ hibernate-beans.xml]: Не удается разрешить ссылку на bean-компонент «mySessionFactory» при установке свойства bean-компонента «sessionFactory»;вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'mySessionFactory', определенного в файле [C: \ eclipse \ workspace \ smart-gwt \ WebContent \ WEB-INF \ resources \ hibernate-beans.xml]: Вызов метода init не выполнен;вложенное исключение: org.hibernate.MappingException: ассоциация ссылается на несопоставленный класс: Prescription

Почему я получаю ошибку unmapped для этого набора?Если я удаляю это из моего hbm.xml, я могу делать все с моей сессии.Есть ли что-то особенное, что нужно сделать при запросе объекта dao?Вот код, который я использую, чтобы получить свой дао.

        Resource resource = new FileSystemResource("./hibernate-beans.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        PrescriptionDao prescriptionDao = (PrescriptionDao)factory.getBean("prescriptionDao");
        PatientDao clientDao = (PatientDao) factory.getBean("patientDao");

Спасибо

1 Ответ

4 голосов
/ 19 июля 2010

Что ж, очевидный ответ заключается в том, что в вашем отображении спящего режима не упоминается класс Prescription, поэтому Hibernate не знает, что с ним делать.просто не показали нам сопоставление, тогда следующий наиболее очевидный ответ таков:

<one-to-many class="Prescription"/>

Атрибут class должен быть полностью определенным именем класса, а не Prescription.Может быть, это должно быть что-то вроде:

<one-to-many class="org.example.smartgwt.shared.model.Prescription"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...