开发者

How to make Hibernate not drop tables

I am using hibernate and whenever I try to add a record it drops the table and adds it again. It never uses the existing table and make changes on that.

This is the relevant part of my hibernate.cfg.xml:

<hibern开发者_如何学运维ate-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>

This is how I save data:

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


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

tells hibernate to update the database schema each time the session factory is created.

And

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

builds a new session factory.

A SessionFactory should be built only once during the wole application lifetime. It should be created once and then reused. Have you read the hibernate reference manual?


Are you sure it gets overwritten or does it not commit? I mean are you commiting your transactions?

Maybe try something in the lines of:

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
}


Hope this can help you

AnnotationConfiguration config = new AnnotationConfiguration();

config.addAnnotatedClass(Employee.class);
config.configure("hibernate.cfg.xml");
new SchemaExport(config).drop(false, false);


I had

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

the first time I deployed. This created my desired schema and populate it with data. The second time I changed to

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

and redeployed. Obviously the tables were dropped. I switched to create for the first deployment and stayed with update with the redeployments. This time tables were not dropped and data stayed untouched.


If you're using annotations try this:

Properties hibernateProperties = new Properties();
// your props ...
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");

// or use Environment.HBM2DDL_AUTO from org.hibernate.cfg.Environment
hibernateProperties.setProperty(Environment.HBM2DDL_AUTO, "update");
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜