Почему этот простой образец гибернации не работает? - PullRequest
2 голосов
/ 10 февраля 2010

Я написал эти два класса:

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 CHARSET ПО УМОЛЧАНИЮ = латинский 1

    CREATE TABLE classeb ( id int (11) NOT NULL AUTO_INCREMENT, annotazione varchar (255) DEFAULT NULL, ПЕРВИЧНЫЙ КЛЮЧ (id) ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARSET ПО УМОЛЧАНИЮ = латинский 1

  • Второе: если я сохраню istance classeA с cb, правильно установленным в cb istance, он будет работать, помещая строку в первую таблицу и строку во вторую таблицу. Но при повторном запуске он даже не загружает classeA ....

Пожалуйста, помогите, так как я думаю, что я не правильно понял эту связь. Пожалуйста, не предлагайте использовать аннотации, так как я не могу. Tnx заранее.

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Я понимаю один на один, что они разделяют личность. То есть, когда вы создаете ClasseA, ClasseB внутри ClasseA будет иметь тот же идентификатор. Между этими двумя таблицами нет явной ссылки.

Для здравомыслия я часто использую много-к-одному, даже в сценарии один-к-одному, потому что это создает столбец внешнего ключа в базе данных, как вы ожидаете.

Я не уверен насчет проблемы с поиском, если немного больше информации о коде, используемом для сохранения и загрузки.

0 голосов
/ 13 февраля 2010

Я думаю, что проблема в том, что идентификатор класса B неправильно связан с классом A. Я предполагаю, что вы связываете 2 класса по первичному ключу. Тогда попробуйте это.

Во-первых, для отношения один-к-одному обоим классам необходимо настроить отображение один-к-одному.

Добавьте это к определению класса B (примечание: ограниченный атрибут важен для инструмента создания схемы гибернации.):

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

Во-вторых, убедитесь, что ваш зависимый класс связывает свой идентификатор с классом A с помощью

<generator class="foreign"> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...