【问题标题】:load gives exception while get dosen't why?load 给出异常,而 get 却没有,为什么?
【发布时间】:2017-04-20 10:32:33
【问题描述】:

这是我的模型类

@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。为什么??

【问题讨论】:

标签: hibernate


【解决方案1】:

这正是这两种方法的预期行为,您可以在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 中,代理是一个对象 给定的标识符值,其属性尚未初始化, 它只是看起来像一个临时的假物体。如果没有找到行,它将 抛出ObjectNotFoundException
  2. session.get() 一直打数据库,返回实物, 代表数据库行的对象,而不是代理。如果没有行 找到,返回null

【讨论】:

  • 如果 session.get() 总是命中数据库,那么如果我将上面的代码更改为这样-session.persist(student); Transaction t1=session.beginTransaction(); session.getTransaction().commit(); student.setName("Prashant"); Student getStudent1=(Student)session.get(Student.class, 1); System.out.println("-----------get------------------"); System.out.println(getStudent1); session.close(); sessionfactory.close(); 为什么它返回 Prashant 而不是 Rajat
  • 那是因为student对象被hibernate缓存到Session所以它还没有从session中删除,所以studentgetStudent1引用了相同的@ 987654341@ 实例,您可以从this answer 深入了解该主题。
【解决方案2】:

作为load 的javadoc 下划线:

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

get 方法并非如此,它自然允许不存在并简单地返回一个空引用。

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

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 2016-05-05
    • 2021-07-08
    • 2020-12-22
    • 2015-01-18
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多