Почему Hibernate SchemaUpdate создает новое поле вместо обновления?

Я пытаюсь программно обновить существующую схему с помощью SchemaUpdate. Я изменил имя существующего имени поля в конкретной таблице, а затем создаю объект конфигурации спящего режима и добавляю измененные файлы hbm.xml в объект конфигурации.

Но когда я сказал SchemaUpdate.execute(true,true), это создает новое поле в таблице вместо обновления.

Вот мой код:

Configuration hibConfiguration = new Configuration();
hibConfiguration.configure(configFileDoc);
hibConfiguration.addDocument(doc1);
 hibConfiguration.addDocument(doc2);

hibConfiguration.buildMappings();
SchemaUpdate schemaUpdate = new SchemaUpdate(hibConfiguration);
schemaUpdate.execute(true, true);

Ниже приведен мой файл cfg.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<hibernate-configuration>
   <session-factory>
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.password">passwrd</property>
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.url">jdbc:mysql://localhot:3306/testSchema</property>
      <property name="hibernate.connection.username">root</property>
      <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
      <property name="javax.persistence.validation.mode">none</property>
      <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <property name="hibernate.default_entity_mode">dynamic-map</property>
   </session-factory>
</hibernate-configuration>

и это мой файл hbm.xml для обновления таблицы:

<?xml version="1.0" encoding="UTF-8"?><hibernate-mapping>
  <class entity-name="testTable2">
    <id column="id" name="id" type="java.lang.Long">
      <generator class="identity"/>
    </id>
    <property column="testTable1Id" length="20" name="testTable1Id" type="java.lang.Long"/>
    <property column="doubleColumnj" length="20" name="doubleColumnj" type="java.lang.Double"/>
  </class>
</hibernate-mapping>

person milind_db    schedule 26.09.2013    source источник


Ответы (1)


Hibernate не контролирует версии таблиц. Он не может определить, что поле было переименовано. Поэтому, когда он сравнивает существующее сопоставление с базой данных, все, что он может определить, это наличие сопоставленного столбца, которого раньше не существовало.

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

person Thierry    schedule 27.09.2013