Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个简单的hibernate示例没有';不行?_Java_Hibernate - Fatal编程技术网

Java 为什么这个简单的hibernate示例没有';不行?

Java 为什么这个简单的hibernate示例没有';不行?,java,hibernate,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 i

我写了两门课:

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

}

正如您在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>

有两件事没有如预期的那样起作用:

  • 首先,由于我使用的是带update的hdb2ddl,所以我希望为classeA生成一个表,并引用classeB(当然还有一个classeB表)。但事实并非如此。我得到的只是:

    创建表
    classea
    (
    id
    INT(11)非空自动增量,
    numero
    VARCHAR(255)默认为空,
    主键(
    id
    ) )ENGINE=INNODB AUTO_INCREMENT=5默认字符集=1

    创建表
    classeb
    (
    id
    int(11)非空自动增量,
    annotazione
    varchar(255)默认为空, 主键(
    id
    ) )ENGINE=InnoDB AUTO_INCREMENT=5默认字符集=1

  • 第二:如果我保存classeA的一个istance,并将cb正确设置为cb istance,那么将一行放在第一个表上,一行放在第二个表上就可以了。但在Retrival上,它甚至不加载classeA


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

我对一对一的理解是,他们有共同的身份。也就是说,当您创建ClasseA时,ClasseA中的ClasseB将具有相同的id。这两个表之间没有显式引用

出于理智,我经常使用多对一,即使是在一对一的场景中,因为这会像您期望的那样在数据库中创建外键列


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

我认为问题在于B类的id与a类没有正确关联。我假设您是通过主键关联这两个类。那就试试这个

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

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


其次,确保依赖类通过使用

<generator class="foreign"> 

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