2017-04-20 17 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(); 
    } 
} 

である私は(取得し、loadメソッド)(保存と持続)とも違いを学ぶしようとしています。 ここで、loadメソッドは例外を返しますが、getメソッドはnullを返します。 loadのJavadocとして

+0

これは、両方のメソッド状態のドキュメントとまったく同じように動作します。 [ドキュメントを読む](https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html)を試しましたか? –

答えて

0

これは正確に両方のメソッドの期待される動作です。単にHibernate Session documentationに表示されます。

  • 何行が見つからない場合、それはObjectNotFoundExceptionがスローされますbeacauseあなたはload()で例外を取得します。
  • get()の場合、行が見つからない場合はnullとなります。

ドキュメント:

ドキュメントは明確に述べている:

  • load(Class theClass, Serializable id)

戻り与えられた識別子で指定されたエンティティクラスの永続的なインスタンスを、と仮定しますインスタンスが存在します。

  • get(Class theClass, Serializable id)

戻り与えられた識別子、またはnullと指定されたエンティティ・クラスの永続的なインスタンスは、そのような永続的なインスタンスが存在しない場合。

説明:

あなたがいることをthis session.get() and session.load() Tutorialで見ることができます:それは常にデータベースを押すことなく、「プロキシ」(用語を休止状態) を返します

  1. session.load()。 Hibernateでは、プロキシは与えられた識別子の値が のオブジェクトで、そのプロパティはまだ初期化されていません。 一時的な偽のオブジェクトのように見えます。行が見つからない場合、 はObjectNotFoundExceptionをスローします。
  2. session.get()常にデータベースにアクセスし、実際のオブジェクト を返します。プロキシではなくデータベース行を表すオブジェクトです。行番号 が見つからない場合は、nullを返します。
+0

session.get()が常にデータベースにヒットした場合、上記のコードを上記のように変更すると 'session.persist(student); \t \tトランザクションt1 = session.beginTransaction(); \t \t session.getTransaction()。commit(); \t \t student.setName( "Prashant"); \t \t学生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 sessionfactory.close(); 'なぜRajatの代わりにPrashantを返すのですか – Prashant

+0

これは、' student'オブジェクトが 'hibernate'によって' Session'にキャッシュされているので 'session'からまだ削除されていないためです'student'と' getStudent1'が同じ 'Student'インスタンスを参照しているなら、[** this answer **](http://stackoverflow.com/a/19872478/3669624)からこのテーマを深く理解することができます。 –

0

は下線:

戻り 与えられた識別子を有する特定のエンティティ・クラスの永続的なインスタンスを、インスタンスが存在すると仮定します。 ... が存在すると仮定してインスタンスを取得する場合は、 のみを使用します。存在しない場合は、 が実際のエラーになります。

これは、自然に存在しないことを許可し、単にnull参照を返すgetメソッドの場合には当てはまりません。

loadは、エンティティの最初の使用(ゲッターがトリガされる)まで、実際のデータベースクエリが実行されないため、パフォーマンスの向上に使用されます。唯一の欠点は、この特定のエントリが実際にデータベースに存在することを確認する必要があることです。

関連する問題