2011-08-03 31 views
6

Tôi không thể hiểu sự khác biệt giữa tải và nhận được. đoạn mã sau không hoạt động khi tôi cung cấp session.load. Nó cho phép ngoại lệ con trỏ null. Nhưng cùng làm việc khi tôi đang sử dụng session.get().hiểu session.get vs session.load phương pháp trong hibernate

public Employee getEmployee(final String id){   
     HibernateCallback callback = new HibernateCallback() { 
      public Object doInHibernate(Session session) 
       throws HibernateException,SQLException { 
       //return (Employee)session.load(Employee.class, id); doesn't work 
        return (Employee)session.get(Employee.class, id); //it works 
      } 
     };   
     return (Employee)hibernateTemplate.execute(callback); 
    } 

Tôi cũng muốn hiểu cách đối tượng Phiên được chuyển đến doInHibernate.?
khi nào phiên bắt đầu và khi nào phiên kết thúc?

Stack trace như sau

Exception in thread "main" java.lang.NullPointerException 
    at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372) 
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121) 
    at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232) 
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173) 
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87) 
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862) 
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781) 
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1282) 
    at $Proxy0.load(Unknown Source) 
    at hibernate.EmployeeDao$1.doInHibernate(EmployeeDao.java:25) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339) 
    at hibernate.EmployeeDao.getEmployee(EmployeeDao.java:29) 
    at hibernate.SpringHibernateTest.main(SpringHibernateTest.java:26) 
+0

Ý bạn là gì bởi "không hoạt động"? Dòng gây ra một NullPointerException là gì? –

+1

Google cho "tại org.hibernate.tuple.AbstractEntityTuplizer.createProxy (AbstractEntityTuplizer.java:372)". Bạn đang chạy một phiên bản cũ của Hibernate, và tôi tìm thấy một số lý do có thể cho ngoại lệ này (bản đồ xấu, lọ xấu, vv). Nó không có nhiều việc phải làm với tải vs get. –

+0

@JB Nizet: Cảm ơn rất nhiều !!! Tôi sẽ kiểm tra cấu hình xây dựng của mình và sẽ cập nhật các lọ cũ mà tôi có nhiều lần phải đối mặt với vấn đề này và đang học cách quấy rối các dự án ... nhưng bạn có thể giúp tôi với những nghi ngờ khác được không. ** cách đối tượng Session được truyền tới doInHibernate. khi nào phiên bắt đầu và khi kết thúc? ** –

Trả lời

8
I am not able to understand the difference between load and get 

Sự khác biệt chính là: nếu tải() không thể tìm ra đối tượng trong bộ nhớ cache hoặc cơ sở dữ liệu, một ngoại lệ được ném. Phương thức load() không bao giờ trả về null. Phương thức get() trả về nếu không tìm thấy đối tượng. Sự khác biệt khác là phương thức load() có thể trả về proxy thay vì một thực thể nhưng get() không bao giờ trả về proxy.

the following piece of code doesn't work when i give session.load. It gives null pointer exception. But same does work when i am using session.get() . 

Nếu đối tượng không được tìm thấy, phương pháp tải sẽ ném ngoại lệ nhưng được won't.Simple

Edit: Để xây dựng những điều,

  1. Khi get() phương thức được gọi, nó sẽ trực tiếp nhấn vào cơ sở dữ liệu, lấy kết quả và trả về. Nếu không tìm thấy trường nào phù hợp, nó sẽ sẵn sàng trả về null.

  2. Nhưng khi load() thực thi, trước tiên nó sẽ tìm kiếm bộ nhớ cache cho đối tượng được yêu cầu. Nếu tìm thấy, tất cả là tốt. Nhưng nếu đối tượng không tìm thấy trong cache, phương thức load() sẽ trả về một proxy. Bạn có thể coi proxy này như là một phím tắt để thực thi truy vấn cơ sở dữ liệu. Hãy nhớ rằng, không có hit cơ sở dữ liệu nào được thực hiện. Bây giờ khi bạn thực sự truy cập vào đối tượng, proxy sẽ được truy tìm và cơ sở dữ liệu sẽ được thực hiện.

Cho phép xem xét một ví dụ đơn giản.

User user=(User)session.load(User.class, new Long(1));//Line 1 
System.out.println(user.getPassword());//Line 2 

Nếu tài khoản đối tượng với khóa chính 1 là không có sẵn trong phiên, phương pháp load() sẽ thiết lập một proxy cho cơ sở dữ liệu ở dòng 1. Bây giờ khi giá trị thực tế của đối tượng 'sử dụng' được gọi, tức là dòng 2, proxy sẽ được truy tìm và cơ sở dữ liệu sẽ bị tấn công.

Hy vọng điều này sẽ hữu ích.

+1

Không: tải không tra cứu đối tượng trong cơ sở dữ liệu. Nó trả về đối tượng nó có trong bộ nhớ cache phiên của nó, hoặc tạo một proxy, giả sử đối tượng tồn tại trong cơ sở dữ liệu. –

+0

@Pravin: Tôi đã đọc tài liệu này từ hướng dẫn sử dụng Tôi muốn ai đó giải thích cho tôi ý nghĩa của những gì bạn vừa nói .. khi người ta nói rằng phương thức tải trả về proxy thay vì thực tế thì tôi hiểu rằng nó trả về dữ liệu từ bộ nhớ cache và Vì vậy, tôi không hiểu rằng con trỏ null ngoại lệ xảy ra khi một giá trị null đang được tham chiếu, câu hỏi của tôi là lý do tại sao nó là null và làm thế nào tôi có thể làm cho nó làm việc với tải để câu trả lời của bạn là hoàn toàn không hữu ích –

+0

@Anupam, tôi đã chỉnh sửa bài đăng để làm cho mọi thứ rõ ràng hơn. Tôi hy vọng điều này sẽ phục hồi đại diện mà tôi đã mất. –

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