2011-11-12 34 views
5

tôi vừa thiết lập một dự án maven/jpa/hibernate cho đến nay vẫn còn rất nhỏ, nơi tôi đang cố gắng duy trì một đối tượng.EntityManager không ghi vào cơ sở dữ liệu

lớp tôi là một khá đơn giản:

@Entity 
public class Person { 
    @Id @GeneratedValue 
    private int id; 
    private String name; 
} 

persistence.xml của tôi là rất cơ bản cũng như:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="Fahrplan_v2"> 
     <class>model.Person</class> 
     <properties> 
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> 
      <property name="hibernate.connection.url" value="jdbc:hsqldb:file:data/db/db" /> 
      <property name="hibernate.connection.username" value="sa" /> 
      <property name="hibernate.connection.password" value="" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Và cuối cùng đây là đoạn code tôi sử dụng để kéo dài các đối tượng:

EntityManager em = entityManagerFactory.createEntityManager(); 
em.getTransaction().begin(); 
em.persist(person); 
// em.flush(); <- does not effect outcome. 
em.getTransaction().commit(); 
em.close(); 

Bây giờ có hai điều tôi mong đợi sẽ xảy ra ở đây: Đầu tiên, tôi hy vọng bảng Person sẽ là cr đã ăn (do hibernate.hbm2ddl.auto = update). Điều này đã xảy ra một lần và chính xác là đã viết ra

CREATE MEMORY TABLE PUBLIC.PERSON(
    ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, 
    NAME VARCHAR(255) 
) 

nhưng tôi không thể tái tạo điều đó. Mỗi lần tôi bắt đầu chương trình của tôi, các tệp cơ sở dữ liệu hsqldb được tạo ra, nhưng không có bảng nào được tạo ra.

Thứ hai, tôi mong chờ đối tượng được lưu giữ lâu dài trong cơ sở dữ liệu, nhưng không phải. Ngoài ra, việc tạo thủ công lược đồ cơ sở dữ liệu không giải quyết được vấn đề, do đó, đó không phải là nguyên nhân gây ra nó. Mã duy trì chạy mà không có bất kỳ ngoại lệ hoặc cảnh báo nào trong đầu ra, tất cả đều trông hoàn toàn ổn. Nhưng đối tượng chỉ không đến trong cơ sở dữ liệu. Đối tượng cũng không được tìm thấy khi truy vấn trình quản lý đối tượng có "từ Person".

Tuy nhiên, truy vấn dường như là điều duy nhất mà DOES làm việc. tôi có thể tự chèn một datum vào cơ sở dữ liệu và truy vấn "từ Person" sẽ lấy thành công nó.

vì vậy, bất kỳ gợi ý nào về những gì tôi đang làm sai ở đây?

+1

Hum alright, vì vậy tôi sẽ đăng nó như là một bình luận vì tôi không được phép trả lời câu hỏi của riêng tôi (chưa?): tôi tìm thấy vấn đề của tôi. em.getTransaction(). cam kết(); Thread.sleep (1000); em.close(); đã thực hiện thủ thuật. sau khi trường hợp thử nghiệm của tôi, JVM tắt quá nhanh, rằng hsqldb đã làm đơn giản là không có đủ thời gian để duy trì dữ liệu đã cam kết vào đĩa. Đừng hỏi tôi tại sao JVM không được duy trì, tôi không thực hiện bất kỳ lệnh gọi System.exit() hay gì cả, phương thức test junit của tôi chỉ đơn giản là kết thúc ở đó. Đối với một số lý do, JVM không được giữ sống bởi những gì tôi giả định là một chủ đề mà nên kiên trì đối tượng của tôi. – MisterD

+0

Bạn được phép trả lời câu hỏi của bạn, được khuyến khích để làm như vậy. Đọc Câu hỏi thường gặp. Câu hỏi của bạn là tốt, vì vậy tóm tắt câu trả lời độc đáo cho mọi người được hưởng lợi. – Siddharth

Trả lời

5

Thêm vào câu trả lời tốt bằng axtavt và làm rõ Làm thế nào giấc ngủ của bạn (1000) làm việc: Đối với các tình huống phát triển mà bạn muốn kiên trì hoàn toàn đồng bộ, hãy tắt write_delay mặc định.

<property name="hibernate.connection.url" 
     value="jdbc:hsqldb:file:data/db/db;shutdown=true;hsqldb.write_delay_millis=0"/>    

Điều này có nghĩa là mọi câu lệnh được ghi vào đĩa trước khi kết quả được trả lại cho người gọi. Đương nhiên, trong hoạt động bình thường, bạn có thể tăng giá trị này. Mặc định là 500 ms, cần ngủ (1000). Thông tin được đưa ra là dành cho HSQLDB phiên bản 2.2.x.

3

Bạn cần phải thêm shutdown=true đến URL cơ sở dữ liệu (hoặc phát hành một explict SHUTDOWN lệnh) để đóng cửa một cách chính xác xuống một cơ sở dữ liệu trong quá trình HSQLDB:

<property name="hibernate.connection.url" 
    value="jdbc:hsqldb:file:data/db/db;shutdown=true" />    

Xem thêm:

+0

Ah vâng, quên đề cập đến điều đó, tôi đã có trước đó và loại bỏ nó bởi vì tôi nghĩ rằng nó có thể góp phần vào vấn đề này. nó không hoạt động có hoặc không có nó. :( – MisterD

0

Hy vọng điều này sẽ giúp ai đó. Đề xuất để đặt độ trễ ghi là 0 ms hoạt động, nhưng nó không hoạt động từ url trừ khi bạn đang tạo một db mới. Để có nó được áp dụng, chạy nó trong một kịch bản khi kết nối với cơ sở dữ liệu sử dụng câu lệnh sql dưới đây:

set files write delay false 

Vì vậy, ví dụ, bạn có thể chạy nó bằng cách sử dụng sqltool.jar như vậy:

java -jar /path/to/sqltool.jar -sql "set files write delay false;" --inlinerc=<rc spec here> 
Các vấn đề liên quan