2012-02-08 18 views
6
em.getTransaction().begin(); 

StringData sd = em.find(StringData.class, key); 
System.out.println("Old value: " + sd.getData()); 
sd.setData(newValue); 
// em.persist(sd); 

em.getTransaction().commit(); 

Như bạn có thể thấy, tôi không gọi số persist, nó đã nhận xét vì tôi đang chạy mã này trước tiên. Tuy nhiên, hóa ra nó không quá khô. Khi kiểm tra cơ sở dữ liệu, tôi thấy dữ liệu được thay đổi (may mắn thay đó là một cơ sở dữ liệu thử nghiệm).JPA/Hibernate có lưu ngay cả khi không gọi số còn lại

Rõ ràng sự hiểu biết của tôi về Hibernate/JPA là thiếu sót. Không gọi số persist luôn được yêu cầu thay đổi dữ liệu phải không? Và nếu không, các quy tắc khi nào một số nội dung được lưu?

+0

nhưng bạn đang gọi cam kết? –

Trả lời

9

Có, thực thể được quản lý được lưu khi một tuôn ra (tuôn ra cũng được thực hiện với một cam kết) được thực hiện nếu bất kỳ thay đổi được phát hiện, nó được gọi là kiểm tra bẩn.

+0

Điều cần biết. Liệu điều đó có thể được dựa vào, hay là một cuộc gọi 'dai dẳng 'vẫn còn khôn ngoan? –

+0

@Bart Chỉ ** được quản lý ** thực thể được lưu theo cách này, được quản lý có nghĩa là trình quản lý thực thể được sử dụng để tải các thực thể đó chưa được đóng, vì vậy hãy cẩn thận. Và tiếp tục hoạt động để tạo ra một thực thể mới. Nếu bạn sử dụng nó trong một thực thể đã tồn tại (như ở đây) nó sẽ ném một ngoại lệ. Hãy xem API: [link] (http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html) – Pablo

+0

Nhưng tôi sử dụng 'persist' trên các thực thể được tải mọi lúc, mà không cần ngoại lệ. –

2
StringData sd = em.find(StringData.class, key); 

Đó dòng mã lấy ví dụ sd StringData so với phiên em, bất kỳ thay đổi bạn thực hiện sẽ được lưu trên tuôn ra (khi giao dịch kết thúc) vì trường hợp đối tượng có liên quan đến phiên em (tức là quản lý).

Bạn có thể tách hoặc trả lại từ phương thức. Bên ngoài giao dịch, nó không liên quan đến phiên em và các thay đổi sẽ không được duy trì cho đến khi nó được đính kèm lại thông qua hợp nhất.

+0

Phần quan trọng không phải là giao dịch được cam kết, phần quan trọng là quản lý thực thể bị đóng. Nếu giao dịch được thực hiện nhưng người quản lý thực thể không bị đóng, thực thể vẫn được liên kết với người quản lý thực thể. – Pablo

+0

@Pablo Vì vậy, điều gì sẽ xảy ra nếu thực thể được thay đổi bên ngoài giao dịch, nhưng trong trình quản lý đối tượng? –

+0

@Bart Người quản lý thực thể sẽ cố gắng lưu nó vào lần sau khi lệnh flush() hoặc commit() được gọi. – Pablo

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