2017-04-20 77 views
2

這裏是我的模型類加載出現異常,但不知道爲什麼?

@Entity 
public class Student { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 
    private String name; 
    private String company; 
    private Date date; 

    @Override 
    public String toString() { 
     return "Student [id=" + id + ", name=" + name + ", company=" + company + ", date=" + date + "]"; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getCompany() { 
     return company; 
    } 
    public void setCompany(String company) { 
     this.company = company; 
    } 
    public Date getDate() { 
     return date; 
    } 
    public void setDate(Date date) { 
     this.date = date; 
    } 

} 

,這裏是主要方法

public class StudentTest { 
    public static void main(String[] args) { 
     SessionFactory sessionfactory=new Configuration().configure().buildSessionFactory(); 
     Session session=sessionfactory.openSession(); 

     Student student=new Student(); 
     student.setName("Rajat"); 
     student.setDate(new Date()); 
     student.setCompany("Yash"); 

     session.persist(student); 
     student.setName("Prashant"); 

     Student getStudent=(Student)session.load(Student.class, 1); 
     System.out.println("--------------load-------------"); 
     System.out.println(getStudent); 

//  Student getStudent1=(Student)session.get(Student.class, 1); 
//  System.out.println("-----------get------------------"); 
//  System.out.println(getStudent1); 

     Transaction t=session.beginTransaction(); 

     session.getTransaction().commit(); 

     session.close(); 
     sessionfactory.close(); 
    } 
} 

我努力學習之間的差異(保存和持續)以及(get和load方法)。 這裏的加載方法給出了異常,而get方法給null.Why ??

+0

此行爲與兩種方法狀態的文檔完全相同。你有沒有試過[閱讀文檔](https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html)? –

回答

0

那麼這是兩種方法的預期行爲,你可以簡單地在Hibernate Session documentation中看到它。

  • 你得到一個異常與load()東陽如果沒有行被發現會拋出ObjectNotFoundException
  • get()同時您將得到null如果沒有行被發現。

文檔:

文件明確表示:

  • load(Class theClass, Serializable id)

返回給定標識給定的實體類的持久化實例,假設該實例存在。

  • get(Class theClass, Serializable id)

返回與給定的識別符,或空給定實體類的持久例如,如果不存在這樣的持久化實例。

說明:

可以在this session.get() and session.load() Tutorial看到:

  1. session.load()它總是會返回一個「代理」(休眠期) 而無需訪問數據庫。在Hibernate中,代理是一個具有 給定標識符值的對象,其屬性尚未初始化,它只是看起來像一個臨時假對象。如果沒有找到行,它會 拋出一個ObjectNotFoundException
  2. session.get()它始終命中數據庫並返回實際對象 表示數據庫行的對象,而不是代理。如果找不到第 行,則返回null
+0

如果session.get()總是碰到數據庫,那麼如果我改變上面的代碼就像這樣 - 'session.persist(student); \t \t Transaction t1 = session.beginTransaction(); \t \t session.getTransaction()。commit(); \t \t student.setName(「Prashant」);學生getStudent1 =(Student)session.get(Student.class,1); \t \t System.out.println(「----------- get ------------------」); \t \t System.out.println(getStudent1); \t \t session.close(); \t \t 012fasessionfactory.close();'爲什麼它會返回Prashant而不是Rajat – Prashant

+0

這是因爲'student'對象被'hibernate'緩存到'Session'中,所以它還沒有從'session'中移除,所以'student'和'getStudent1'引用相同的'Student'實例,您可以從[**這個答案**](http://stackoverflow.com/a/19872478/3669624)中深入瞭解這個主題。 –

0

作爲的Javadoc load強調:

返回與 給定標識符的給定實體類的持久實例,假設實例存在。 ...僅使用此 可檢索您認爲存在的實例,其中不存在 將是實際的錯誤。

這不是get方法的情況,它自然允許不存在並簡單地返回空引用。

load用於提高性能,因爲在第一次使用實體(例如觸發器)之前沒有實際的數據庫查詢被觸發。唯一的缺點是你必須確保這個特定的條目實際存在於數據庫中。

相關問題