2010-02-10 149 views
2

我寫這兩個類:爲什麼這個簡單的休眠樣本不起作用?

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

} 

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


} 

正如你可以看到ClasseA有到ClasseB參考。

這是映射:

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

兩個事情沒有達到預期效果:

  • 首先,因爲我使用hdb2ddl與更新我預期的那樣產生一個關於classeB的表格(當然還有一個關於classeB的表格)。不是。我得到的是:

    CREATE TABLE classeaid INT(11)NOT NULL AUTO_INCREMENT, numero VARCHAR(255)DEFAULT NULL,
    PRIMARY KEY(id) )ENGINE = INNODB AUTO_INCREMENT = 5的默認字符集= LATIN1

    CREATE TABLE classebid INT(11)NOT NULL AUTO_INCREMENT, annotazione VARCHAR(255)DEFAULT NULL, PRIMARY KEY(id) )ENGINE = InnoDB的AUTO_INCREMENT = 5的默認字符集= LATIN1

  • 第二:如果我救classeA與CB正確設置爲CB istance的istance,將工作放一排第一,排在第二表。但在retrivial它甚至不加載classeA ....

請幫助,因爲我認爲我不明白這種類型的協會。請不要建議使用註釋,因爲我不能。 Tnx提前。

回答

1

我的理解是一對一的,他們共享身份。也就是說,當您創建ClasseA時,ClasseA中的ClasseB將具有相同的ID。兩個表格之間沒有明確的參考。

爲了保持健全,即使在一對一的情況下,我也經常使用多對一的方式,因爲這會像您所期望的那樣在數據庫中創建外鍵列。

我不確定您正在使用的檢索問題,而沒有關於用於保存和加載的代碼的更多信息。

0

我認爲問題是B類的ID沒有正確地關聯到A類。我假設你通過主鍵關聯了2個類。然後試試這個。

首先,對於一對一的關係,兩個類都需要配置一對一的映射。

將此添加到B類的定義 (注意:約束屬性對於休眠模式生成工具很重要。):

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

其次,確保您的依賴類的ID A類關聯使用

<generator class="foreign"> 
相關問題