2011-09-17 22 views
5

Tôi mới để ngủ đông và bắt đầu nghiên cứu hibernate.The chương tôi đang đi qua sử dụng ngủ đông với JDBC() Câu hỏi đầu tiên của tôi là Không hibernate sử dụng jdbc Tôi có thể thấy một số đề cập đến JTA cũng ở đây, như phương thức getCurrentSeessionSession() có được phiên liên quan đến giao dịch JTA hiện tại. JTA và jdbc ở đây ở chế độ ngủ đôngCó hibernate sử dụng jdbc nội bộ hoặc JTA nội bộ hoặc nó có thể cấu hình? "

Câu hỏi2: - Tôi có thể xem đoạn mã dưới đây trong bất kỳ thao tác nào trong chế độ ngủ đông

try{ 
session=factory.openSession(); 
tx=session.beginTransaction(); 
session.save(myClass); 
tx.commit(); 
} 
finally{ 
session.close(); 
} 

Ở đây, tôi muốn hiểu vai trò của dòng // tx = session.beginTransaction(); Theo hiểu biết, mỗi phiên sẽ sử dụng một kết nối. Vì vậy, ngay cả nếu chúng tôi bắt đầu nhiều giao dịch từ cùng một phiên, chúng tôi sẽ sử dụng cùng một kết nối. khi chúng tôi cam kết giao dịch cụ thể, tất cả giao dịch được tạo từ cùng một phiên sẽ được thực hiện một lần. Vậy chúng ta đang cố gắng đạt được điều gì với // tx = session.beginTransaction(); ?

Trả lời

12

Hibernate có sử dụng jdbc nội bộ hoặc JTA nội bộ để thực hiện liên tục và nhận các thao tác không?

JDBC và JTA không thể hoán đổi cho nhau. JDBC is the standard API mà các ứng dụng Java sử dụng để tương tác với một cơ sở dữ liệu. JTA is the standard API để quản lý giao dịch trên một hoặc nhiều tài nguyên. Câu trả lời gần nhất cho câu hỏi của bạn sẽ là "nội bộ", Hibernate sử dụng JDBC để tương tác với cơ sở dữ liệu.

Giống như phương thức getCurrentSeessionSession() lấy phiên được liên kết với giao dịch JTA hiện tại.

Không chính xác. SessionFactory.getCurrentSession() nhận phiên theo số current session context. Một thực hiện chiến lược đó là JTA session context, về cơ bản liên kết các phiên với giao dịch JTA. Một giao dịch JTA không "có" một phiên Hibernate, vì JTA không biết gì về Hibernate, và nó sẽ không hoàn toàn đúng khi nói rằng Hibernate sử dụng JTA nội bộ. Nó đơn giản có khả năng tích hợp với JTA và để cho nó quản lý các giao dịch.

ở đây tôi muốn hiểu vai trò của dòng // tx = session.beginTransaction();

Bắt đầu giao dịch trong bất kỳ cơ chế giao dịch nào bạn đang sử dụng, được điều chỉnh bởi TransactionFactory đang được sử dụng. Ví dụ, với JDBCTransactionFactory, nó chỉ đảm bảo auto-commit bị tắt để thay đổi sẽ không được cam kết cho đến khi giao dịch hoàn tất.

khi chúng tôi cam kết giao dịch cụ thể tất cả các giao dịch được tạo từ cùng một phiên sẽ được cam kết một lần.

Trong trường hợp bình thường, Phiên được kết hợp với chỉ một giao dịch. Nhiều cuộc gọi đến Session.beginTransaction() sẽ chỉ đơn giản là return the same underlying Transaction.

Vì vậy, những gì chúng tôi đang cố gắng để đạt được với // tx = session.beginTransaction()

Chỉ cần rằng: tell bất cứ điều gì đang quản lý các giao dịch của bạn rằng bạn đang bắt đầu một giao dịch mới. Điều đó ngụ ý rằng mọi thứ xảy ra cho đến khi bạn commit() hoặc rollback() phải có ngữ nghĩa chung được chấp nhận là database transaction.

+0

Cảm ơn Ryan Đối với câu trả lời như vậy. Chỉ còn hai điểm nữa thôi. Như bạn đã nói "JDBC là API tiêu chuẩn mà các ứng dụng Java sử dụng để tương tác với cơ sở dữ liệu", tôi có thể nói mọi ứng dụng java sẽ sử dụng jdbc để kết nối với cơ sở dữ liệu một cách rõ ràng hoặc nội bộ (trong trường hợp bất kỳ công cụ orm nào như hibernate) hoặc EJB. Bạn đã nói "JTA là API chuẩn để quản lý giao dịch trên một hoặc nhiều tài nguyên". Tôi có kịch bản này trong một ứng dụng java tôi có hai lược đồ khác nhau làm cơ sở dữ liệu. Ở đây tôi vẫn sẽ được sử dụng jdbc cho cả cơ sở dữ liệu/lược đồ. Ngoài ra tôi sẽ được sử dụng JTA ở đây để quản lý tiếp tục ..... –

+0

tiếp tục ... các giao dịch trên cả hai schemas.Right? –

+0

@Mohit: Nó sẽ là một ứng dụng Java cực kỳ hiếm có kết nối với một cơ sở dữ liệu khác với JDBC. Tôi đã không bao giờ nghe nói về một bản thân mình, nhưng nó * có thể * xảy ra. Đối với JTA, nó chỉ là API giao dịch JEE. Có nhiều cách khác để quản lý các giao dịch, chẳng hạn như quản lý giao dịch của Spring (có thể, tuy nhiên, cũng tích hợp với JTA). Nếu bạn muốn phân phối các giao dịch, tôi không biết nhiều về chúng, nhưng tôi nghĩ bạn có thể sẽ muốn thực hiện JTA. –

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