2011-07-07 17 views
6

Używam trybu hibernacji, a za każdym razem, gdy próbuję dodać rekord, opuszcza on tabelę i dodaje ją ponownie. Nigdy nie korzysta z istniejącej tabeli i nie wprowadza na nią zmian.Tworzenie tabel Hibernuj a nie upuszczanie

To jest odpowiednia część mojego 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> 

ten sposób mogę zapisać danych:

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

Odpowiedz

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

mówi hibernacji zaktualizować schematu bazy danych za każdym razem, gdy fabryka sesja jest tworzony.

I

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

buduje nową fabrykę sesji.

Należy zbudować tylko jeden raz podczas okresu użytkowania wole. Powinien zostać utworzony raz, a następnie ponownie wykorzystany. Czy czytasz hibernate reference manual?

+1

Czy istnieje sposób, aby sesja załadowała już istniejącą zawartość bazy danych? W bazie danych znajdują się wartości po tym, jak aplikacja przestanie działać, a kiedy ponownie uruchomię aplikację, chcę, aby dodała ona rekordy do tego, co już jest w bazie danych. – Sujen

+1

Przeczytaj ponownie moją odpowiedź i przeczytaj instrukcję obsługi. Używając hibernate.hbm2ddl.auto = auto, mówisz hibernacji, aby aktualizować schemat za każdym razem, gdy tworzysz fabrykę sesji. Więc odtwarza stół. Jest to przydatne do szybkich testów z pustą bazą danych. Jeśli masz jakieś dane, które chcesz zachować, zmień schemat ręcznie i usuń tę opcję konfiguracji z pliku konfiguracyjnego. –

+0

W porządku, byłem zdezorientowany, ponieważ myślałem, że ta własność została użyta do przechowywania zawartości z bazy danych, zamiast jej odtworzenia (coś, co przeczytałem gdzieś indziej i myślę, że okazuje się być przeciwieństwem tego, co myślałem). Dzięki, wypróbuję Twoje rozwiązanie, gdy dostanę szansę. – Sujen

1

Czy jesteś pewien, że zostaną nadpisane, czy też nie popełnić? Mam na myśli, czy zlecasz swoje transakcje?

Może spróbuj coś w linii:

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

Posiadałem zatwierdzenie transakcji. Zapomniałem umieścić go w moim poście. Edytowałem to teraz. – Sujen

1

nadzieję, że może pomóc

AnnotationConfiguration config = new AnnotationConfiguration(); 

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

miałem

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

pierwszy raz wdrożony. Stworzyło to mój pożądany schemat i zapełniło go danymi. Za drugim razem zmieniono na

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

i ponownie wdrożono. Oczywiście tabele zostały opuszczone. Przełączyłem na create dla pierwszego wdrożenia i pozostały przy update wraz z przesunięciami. Tym razem tabele nie zostały usunięte, a dane pozostały nietknięte.