1 votes

hibernate - ensemble de mapping spring/bean

Je suis plutôt novice en ce qui concerne le système spring-hibernate et j'ai essayé de le faire fonctionner.

J'ai un modèle de données comme celui-ci :

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

J'utilise des spring beans avec un template hibernate pour définir ma session/template hibernate et mon dao comme ceci :

    <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>

Pendant un moment, je n'avais que patient table et tout était ok. Mais ensuite, j'ai décidé d'ajouter un prescription qui utilise une clé étrangère de type patient_id . En gros, j'ai 2 objets modèles POJO comme ceci :

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;
}
}

(Ce qui est plus simple pour Prescription).

La chose qui me dérange est le private Set patientPrescriptions membre. Voici mon mappage hbm.xml pour ma classe patient.

<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>

Dès que je fais référence à cela dans mon fichier de mappage patient.hbm.xml, j'obtiens une erreur.

org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'prescriptionDao' defined in file [ C:\eclipse\workspace\smart -gwt \WebContent\WEB -INF \resources\hibernate -beans.xml] : Cannot resolve reference to bean 'hibernateTemplate' while setting bean property 'hibernateTemplate' ; nested exception is org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'hibernateTemplate' defined in file [ C:\eclipse\workspace\smart -gwt \WebContent\WEB -INF \resources\hibernate -beans.xml] : Cannot resolve reference to bean 'mySessionFactory' while setting bean property 'sessionFactory' ; nested exception is org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'mySessionFactory' defined in file [ C:\eclipse\workspace\smart -gwt \WebContent\WEB -INF \resources\hibernate -beans.xml] : L'invocation de la méthode init a échoué ; l'exception imbriquée est org.hibernate.MappingException : L'association fait référence à une classe non mappée : Prescription

Pourquoi est-ce que je reçois le non cartographié erreur pour ce jeu ? Si je le supprime de mon hbm.xml, je peux faire à peu près tout avec ma session. Y a-t-il quelque chose de spécial à faire en demandant l'objet dao ? Voici le code que j'utilise pour obtenir mon 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");

Merci.

4voto

skaffman Points 197885

Eh bien, la réponse évidente est que votre mappage hibernate ne fait pas mention de l'option Prescription donc Hibernate ne sait pas quoi en faire.

En supposant que ce n'est pas le cas, et que vous n'avez tout simplement pas montré la cartographie, la réponse la plus évidente est la suivante :

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

Le site class devrait être un nom de classe entièrement qualifié, qui Prescription ne l'est pas. Peut-être que ça devrait être quelque chose comme :

<one-to-many class="org.example.smartgwt.shared.model.Prescription"/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X