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?
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
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