2010-02-10 3 views
2

j'ai écrit ces deux classes:Pourquoi cet exemple d'hibernation simple ne fonctionne pas?

public class ClasseA { 

    Integer id; 
    String numero; 
    ClasseB cb; 

    public ClasseB getCb() { 
     return cb; 
    } 

    public void setCb(ClasseB cb) { 
     this.cb = cb; 
    } 


    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getNumero() { 
     return numero; 
    } 

    public void setNumero(String numero) { 
     this.numero = numero; 
    } 

} 

et

public class ClasseB { 

    Integer id; 
    String annotazione; 

    public String getAnnotazione() { 
     return annotazione; 
    } 

    public void setAnnotazione(String annotazione) { 
     this.annotazione = annotazione; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 


} 

Comme vous pouvez le voir dans ClasseA il y a une référence à ClasseB.

c'est la mise en correspondance:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class dynamic-insert="false" dynamic-update="false" mutable="true" name="ClasseA" optimistic-lock="version" polymorphism="implicit" select-before-update="false"> 
    <id name="id" type="java.lang.Integer"> 
     <column name="id"/> 
     <generator class="identity"/> 
    </id> 
    <property name="numero" type="java.lang.String"> 
     <column name="numero"/> 
    </property> 
    <one-to-one cascade="all" class="ClasseB" name="cb"/> 
    </class> 
    <class dynamic-insert="false" dynamic-update="false" mutable="true" name="ClasseB" optimistic-lock="version" polymorphism="implicit" select-before-update="false"> 
    <id name="id" type="java.lang.Integer"> 
     <column name="id"/> 
     <generator class="identity"/> 
    </id> 
    <property name="annotazione" type="java.lang.String"> 
     <column name="annotazione"/> 
    </property> 
    </class> 
</hibernate-mapping> 

Deux choses ne fonctionnent pas comme prévu:

  • D'abord, depuis que je suis en utilisant hdb2ddl avec mise à jour je vous attendez ne génèrent une table pour la classeA avec une référence à la classeB (et bien sûr une table pour la classeB). Ce qui n'est pas. Tout ce que je reçois est:

    CREATE TABLE classea ( id INT (11) NOT AUTO_INCREMENT NULL, numero VARCHAR (255) NULL DEFAULT,
    clé primaire (id) ) MOTEUR = INNODB AUTO_INCREMENT = 5 DEFAULT charset = latin1

    CREATE TABLE classeb ( id int (11) NOT NULL AUTO_INCREMENT, annotazione varchar (255) NULL DEFAULT, clé primaire (id) ) MOTEUR = InnoDB AUTO_INCREMENT = 5 DEFAULT CHARSET = latin1

  • Deuxième: Si je sauve une istance de classeA avec cb est correctement réglée sur une istance cb, il travaillera de mettre une ligne sur la première et une ligne sur la seconde table. Mais en revanche il ne charge même pas classeA ....

S'il vous plaît aider car je pense que je n'ai pas bien compris ce type d'association. S'il vous plaît ne suggère pas d'utiliser des annotations comme je ne peux pas. Tnx à l'avance.

Répondre

1

Ma compréhension de one-to-one est qu'ils partagent l'identité. C'est-à-dire que lorsque vous créez une ClasseA, la ClasseB à l'intérieur de ClasseA aura le même identifiant. Il n'y a pas de référence explicite entre les deux tables.

Pour la santé mentale, j'utilise souvent plusieurs-à-un, même dans le scénario un-à-un, parce que cela crée la colonne de clé étrangère dans la base de données comme vous attendez.

Je ne suis pas sûr du problème de récupération que vous avez sans un peu plus d'informations sur le code utilisé pour enregistrer et charger.

0

Je pense que le problème est que l'identifiant de classe B n'est pas correctement associé à la classe A. Je suppose que vous associez les 2 classes par clé primaire. Alors essayez ceci. Tout d'abord, pour une relation un-à-un, les deux classes ont besoin d'un mappage un-à-un configuré.

Ajoutez ceci à la définition de classe B (note: l'attribut contraint est important pour l'outil de génération de schéma d'hibernation.):

<one-to-one class="ClasseA" name="ca" constrained="true" /> 

En second lieu, vous assurer que votre classe dépendante associe son id à la classe A en utilisant

<generator class="foreign"> 
Questions connexes