2011-07-07 39 views
6

Tôi đang sử dụng ngủ đông và bất cứ khi nào tôi cố gắng thêm bản ghi, nó sẽ giảm bảng và thêm lại. Nó không bao giờ sử dụng bảng hiện có và thực hiện các thay đổi trên đó.Làm thế nào để làm cho Hibernate không thả bảng

Đây là phần có liên quan của tôi 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> 

Đây là cách tôi lưu dữ liệu:

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

Trả lời

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

nói ngủ đông để cập nhật database schema mỗi lần nhà máy phiên được tạo ra.

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

xây dựng một nhà máy phiên làm việc mới.

A SessionFactory chỉ nên được xây dựng một lần trong suốt thời gian sử dụng ứng dụng. Nó sẽ được tạo ra một lần và sau đó được tái sử dụng. Bạn đã đọc số hibernate reference manual chưa?

+1

Có cách nào để làm cho phiên tải nội dung cơ sở dữ liệu đã có? Có các giá trị trong cơ sở dữ liệu sau khi ứng dụng ngừng chạy, và khi tôi khởi động lại ứng dụng, tôi muốn nó thêm bản ghi trên đầu những gì đã có trong cơ sở dữ liệu. – Sujen

+1

Đọc lại câu trả lời của tôi và đọc hướng dẫn tham khảo. Sử dụng hibernate.hbm2ddl.auto = auto, bạn đang nói hibernate để cập nhật lược đồ mỗi khi bạn tạo một nhà máy phiên. Vì vậy, nó tạo lại bảng. Điều này rất hữu ích cho các bài kiểm tra nhanh chóng với một cơ sở dữ liệu trống. Nếu bạn có một số dữ liệu bạn muốn giữ lại, hãy thay đổi lược đồ của bạn theo cách thủ công và xóa tùy chọn cấu hình này khỏi tệp cấu hình của bạn. –

+0

Oh alright, tôi đã nhầm lẫn vì tôi nghĩ rằng tài sản được sử dụng để giữ nội dung từ cơ sở dữ liệu thay vì tạo lại nó (một cái gì đó tôi đọc từ một nơi khác và tôi đoán nó quay ra được đối diện của những gì tôi nghĩ). Cảm ơn tôi sẽ thử giải pháp của bạn khi tôi có cơ hội. – Sujen

1

Bạn có chắc chắn nó được ghi đè hay nó không cam kết? Tôi có nghĩa là bạn cam kết giao dịch của bạn?

Có thể thử một cái gì đó trong dòng:

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

Tôi đã cam kết giao dịch. Tôi quên đặt nó vào bài viết của mình. Tôi đã chỉnh sửa nó ngay bây giờ. – Sujen

1

Hy vọng điều này có thể giúp bạn

AnnotationConfiguration config = new AnnotationConfiguration(); 

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

tôi đã

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

lần đầu tiên tôi được triển khai. Điều này tạo ra giản đồ mong muốn của tôi và điền nó với dữ liệu. Lần thứ hai tôi đổi thành

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

và triển khai lại. Rõ ràng các bảng đã bị loại bỏ. Tôi chuyển sang create cho lần triển khai đầu tiên và ở lại với update với các lần triển khai lại. Bảng thời gian này không bị giảm và dữ liệu vẫn không bị ảnh hưởng.

Các vấn đề liên quan