加载给出了异常,而得到了什么?

时间:2017-04-20 10:32:34

标签: hibernate

这是我的模型类

@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方法给出异常,而get方法给出null。为什么?

2 个答案:

答案 0 :(得分:0)

由于load的javadoc强调:

  

返回给定实体类的持久化实例   给定标识符,假设实例存在。 ......仅用它   检索您认为存在的实例,其中不存在   这将是一个实际的错误。

get方法不是这种情况,它自然允许不存在并且只返回空引用。

load用于提高性能,因为在第一次使用实体(例如触发getter)之前,不会触发实际的数据库查询。唯一的缺点是你必须确保这个特定的条目实际存在于数据库中。

答案 1 :(得分:0)

这正是两种方法的预期行为,你可以在Hibernate Session documentation中看到它。

  • load()会出现异常,因为如果找不到行,它会抛出ObjectNotFoundException
  • 使用get()时,如果找不到行,您将获得null

<强>文档

文件清楚地说:

  • load(Class theClass, Serializable id)
  

返回具有给定标识符的给定实体类的持久化实例,假设该实例存在。

  • get(Class theClass, Serializable id)
  

使用给定的标识符返回给定实体类的持久化实例,如果没有这样的持久化实例,则返回null。

<强>解释

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

  1. session.load()它将始终返回“代理”(Hibernate术语) 没有打到数据库。在Hibernate中,proxy是一个对象 给定的标识符值,其属性尚未初始化, 它看起来像一个临时假物体。如果没有找到行,它会 抛出ObjectNotFoundException
  2. session.get()它总是命中数据库并返回真实对象, 表示数据库行的对象,而不是代理。如果没有排 发现,它返回null