Как заставить Hibernate не сбрасывать таблицы - PullRequest
7 голосов
/ 07 июля 2011

Я использую hibernate и всякий раз, когда я пытаюсь добавить запись, она удаляет таблицу и добавляет ее снова. Он никогда не использует существующую таблицу и не вносит в нее изменения.

Это релевантная часть моего hibernate.cfg.xml:

<hibernate-configuration>
<session-factory>
  <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
  <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property>
  <property name="hibernate.connection.username">user</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.pool_size">10</property>
  <property name="show_sql">true</property>
  <property name="dialect">org.hibernate.dialect.DerbyDialect</property>
  <property name="hibernate.hbm2ddl.auto">update</property>
  <property name = "current_session_context_class">thread</property>
  <!-- Mapping the entities -->
<mapping class="inputDetails.Table1"/>
<mapping class="inputDetails.Table2"/>


  <!--mapping resource="contact.hbm.xml"/-->
</session-factory>
</hibernate-configuration>

Вот как я сохраняю данные:

SessionFactory factory = new Configuration().configure().buildSessionFactory();
    Session session = factory.getCurrentSession();
    session.beginTransaction();
//...
session.save(newrecord)
session.getTransaction().commit();

Ответы [ 4 ]

18 голосов
/ 07 июля 2011
<property name="hibernate.hbm2ddl.auto">update</property>

указывает hibernate обновлять схему базы данных каждый раз, когда создается фабрика сеанса.

А

SessionFactory factory = new Configuration().configure().buildSessionFactory();

создает новую фабрику сессий.

A SessionFactory должен создаваться только один раз в течение срока службы приложения. Он должен быть создан один раз, а затем использован повторно. Вы прочитали справочное руководство по спящему режиму ?

1 голос
/ 02 октября 2014

У меня было

<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.hbm2ddl.import_files" value="META-INF/import.sql" />

при первом развертывании.Это создало мою желаемую схему и наполнило ее данными.Во второй раз я изменил на

<property name="hibernate.hbm2ddl.auto" value="update" />

и снова развернул.Очевидно, что таблицы были отброшены.Я переключился на create для первого развертывания и остался на update с повторными развертываниями.На этот раз таблицы не были удалены, а данные остались нетронутыми.

1 голос
/ 24 декабря 2011

Надеюсь, это поможет вам

AnnotationConfiguration config = new AnnotationConfiguration();

config.addAnnotatedClass(Employee.class);
config.configure("hibernate.cfg.xml");
new SchemaExport(config).drop(false, false);
1 голос
/ 07 июля 2011

Вы уверены, что он перезаписан или не зафиксирован?Я имею в виду, вы совершаете свои транзакции?

Может быть, попробуйте что-то вроде:

try {
    factory.getCurrentSession().beginTransaction();

    // Do some work
    factory.getCurrentSession().load(...);
    factory.getCurrentSession().persist(...);

    factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
    factory.getCurrentSession().getTransaction().rollback();
    throw e; // or display error message
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...