我写了这两节课:

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与update一起使用,因此我希望确实会生成classeA的表,并引用classeB(当然还有classeB的表)。不是。我得到的是:

创建表classea
  id INT(11)非空AUTO_INCREMENT,
  numero VARCHAR(255)默认为空,
  主键(id
)ENGINE = INNODB AUTO_INCREMENT = 5 DEFAULT CHARSET = latin1

创建表classeb
  id int(11)NOT NULL AUTO_INCREMENT,
  annotazione varchar(255)默认为空,
  主键(id
)ENGINE = InnoDB AUTO_INCREMENT = 5 DEFAULT CHARSET = latin1
第二:如果我将cb正确地设置为cb距离,保存了classeA的距离,它将在第一张表上放置一行,在第二张表上放置一行。但是在重发时,它甚至都不会加载classA。


请帮忙,因为我认为我不太了解这种关联。请不要建议使用注释,因为我不能这样做。提前Tnx。

最佳答案

我与一对一的理解是,他们共享身份。也就是说,当您创建ClasseA时,ClasseA内部的ClasseB将具有相同的ID。这两个表之间没有明确的引用。

为了保持理智,即使在一对一的情况下,我也经常使用多对一的方法,因为这会像您期望的那样在数据库中创建外键列。

如果没有更多有关用于保存和加载代码的信息,我不确定您遇到的检索问题。

09-26 21:34