为什么这个简单的hibernate示例不起作用?

时间:2010-02-10 16:46:20

标签: java hibernate

我写了这两个类:

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,我希望为classeA生成一个表,其中包含对classeB的引用(当然还有classeB的表)。哪个不是。我得到的只是:

    CREATE TABLE classea(   id INT(11)NOT NULL AUTO_INCREMENT,   numero VARCHAR(255)DEFAULT NULL,
      主要关键(id) )ENGINE = INNODB AUTO_INCREMENT = 5 DEFAULT CHARSET = latin1

    CREATE TABLE classeb(   id int(11)NOT NULL AUTO_INCREMENT,   annotazione varchar(255)DEFAULT NULL,   主要关键(id) )ENGINE = InnoDB AUTO_INCREMENT = 5 DEFAULT CHARSET = latin1

  • 第二:如果我保存classeA的一个等级,并且cb正确设置为cb istance,它将在第一个和第二个表的行上放置一行。但在追溯时它甚至没有加载classeA ....

请帮助,因为我认为我没有正确理解这种关联。请不要建议使用注释,因为我不能。 Tnx提前。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我认为问题是B类的ID与A类没有正确关联。我假设您通过主键关联了2个类。然后尝试一下。

首先,对于一对一关系,两个类都需要配置一对一映射。

将此添加到B类的定义中 (注意:约束属性对于hibernate模式生成工具很重要。):

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

其次,确保您的依赖类使用

将其id与A类相关联
<generator class="foreign">