2017-04-20 88 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用于提高性能,因为在第一次使用实体(例如触发器)之前没有实际的数据库查询被触发。唯一的缺点是你必须确保这个特定的条目实际存在于数据库中。

相关问题