hibernate的JPA实现中,即使Book对象设置了缓存,每次
用em.find(Book.class,id)返回的对象都不同呢?Book book1 = em.find(Book.class,123L);
Book book2 = em.find(Book.class,123L);虽然book1和book2内容一致,但book1==book2和book1.equals(book2)都返回false为何???

解决方案 »

  1.   

    楼主在Book类中重写hashCode()和equals()方法试试!
    直接用myeclipse生成!
      

  2.   

    == 比较的是两个变量所引用的对象内存地址是否相同,每次查都生成不同的对象,当然不可能相等了。如同楼上帅哥所说的,生成 hashCode 和 equals 方法后,使用 equals 进行比较。
      

  3.   

    我问的目的是想确认是否em.find每次都返回一个新对象,即使key一样
      

  4.   


    jpa查询的机制你应该清楚,先去缓存找,缓存无才去数据库找。
    这样,缓存中存在(此时无其他人操作数据库),你拿出来,你也说了,内容一样。
    如果你认为==为false,就是“新”,那你应该自己将hashcode和equals方法重写。
      

  5.   

    我问的目的是想确认是否em.find每次都返回一个新对象,即使key一样。
    我的意思是说,没必要每次都返回一个新对象呀,直接返回缓存的对象本身不行么?
    感觉每次都是返回的book.clone()
    如果直接返回的就是原来那个对象,那==肯定自然就是true了呀。
    比如有100次em.find且不是要生成100个内容相同的对象,多占内存呀?
      

  6.   


    如果缓存中没有指定的实体,EntityManager会创建一个新的实体,但是不会立即访问数据库来加载持久状态,而是在第一次访问某个属性的时候才加载。
      

  7.   

    我想是代理的的问题吧!估计要重写hashCode()和equals()方法!
    Book book1 = em.find(Book.class,123L);
    Book book2 = em.find(Book.class,123L);
    每次查询hibernate应该都会产生新的对象,建议重写hashCode()和equals()方法!
      

  8.   

    我肯定的是book是设置了缓存并生效了的(没有重新执行sql),但连续两次找出来的对象都是新对象,尽管值一样。你们可以测试下
      

  9.   


    你顺便也试试hibernate的find,load等。
      

  10.   


    你顺便也试试hibernate的find,load等。