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");
精彩评论