2011-07-07 16 views
6

Estoy usando hibernate y cada vez que trato de agregar un registro, deja caer la tabla y la vuelve a agregar. Nunca usa la tabla existente y realiza cambios en eso.Cómo hacer que Hibernate no elimine tablas

Esta es la parte relevante de mi 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> 

Así es como puedo guardar los datos:

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

Respuesta

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

le dice a Hibernate para actualizar el esquema de base de datos cada vez que se crea la fábrica de sesión.

Y

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

construye una nueva fábrica de sesiones.

A SessionFactory debe construirse solo una vez durante la vida útil de la aplicación wole. Debe ser creado una vez y luego reutilizado. ¿Has leído el hibernate reference manual?

+1

¿Hay alguna manera de que la sesión cargue los contenidos de la base de datos ya existentes? Hay valores en la base de datos después de que la aplicación deje de ejecutarse, y cuando vuelva a iniciar la aplicación, quiero que agregue registros además de lo que ya está en la base de datos. – Sujen

+1

Lee mi respuesta nuevamente y lee el manual de referencia. Usando hibernate.hbm2ddl.auto = auto, le está diciendo a hibernate que actualice el esquema cada vez que cree una fábrica de sesión. Entonces recrea la tabla. Esto es útil para pruebas rápidas con una base de datos vacía. Si tiene algunos datos que desea conservar, modifique su esquema manualmente y elimine esta opción de configuración de su archivo de configuración. –

+0

Oh, bien, estaba confundido porque pensé que la propiedad se usaba para mantener los contenidos de la base de datos en lugar de volver a crearlos (algo que leo de otro lado y supongo que es lo contrario de lo que pensaba). Gracias, intentaré tu solución cuando tenga la oportunidad. – Sujen

1

¿Estás seguro de que se sobreescribe o se ha cometido? Quiero decir ¿estás comprometiendo tus transacciones?

Tal vez intente algo en la línea de:

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 
} 
+0

Tuve la transacción confirmada. Olvidé ponerlo en mi publicación. Lo edité ahora. – Sujen

1

Hope esto le puede ayudar

AnnotationConfiguration config = new AnnotationConfiguration(); 

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

que tenía

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

la primera vez que desplegó. Esto creó mi esquema deseado y lo llenó con datos. La segunda vez que cambié a

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

y volví a desplegarlo. Obviamente, las tablas se descartaron. Cambié a create para la primera implementación y me quedé con update con las redespliegues. Estas tablas de tiempo no se descartaron y los datos permanecieron intactos.

Cuestiones relacionadas