Hibernate常见问题(不断更新中)

1.org.hibernate.MappingException: Unknown entity: Xxx
没有在hibernate.cfg.xml中定义类Xxx对应的Xxx.hbm.xml位置.

2.org.hibernate.HibernateException: Hibernate Dialect must be explicitly set
没有指定hibernate.cfg.xml位置,

new Configuration().configure()默认指定为hibernate.cfg.xml

Configuration c  =   new  Configuration().configure();
SessionFactory sf 
=  c.buildSessionFactory();

3.load()/get()区别
load先查缓存如果缓存中存在就直接返回缓存中的ID对应的对象;
如果缓存中不存在就判断lazy;
如果lazy = true,则不报任何异常,继续执行下面代码,而在下面访问该对象属性的时候,如果数据库中记录不存在就会抛出org.hibernate.ObjectNotFoundException异常,如果数据库中记录存在,则返回相应记录;
如果lazy = false, 则直接查询数据库,如果数据库中记录不存在则抛出异常org.hibernate.ObjectNotFoundException: No row with the given identifier exists,如果数据库中记录存在,则返回相应记录

get()方法如果找不到记录将返回null,但也可能抛出ObjectNotFoundException异常(如先load后get)

 举例:

load取缓存中数据

Person p1  =  (Person)s.load(Person. class " 00004 " ); // 取不到缓存中数据,lazy = true ,不执行sql,所以不出异常
Person p2  =  (Person)s.load(Person. class " 00004 " ); // 查询缓存,得到数据,不执行sql,不出异常
System.out.println(p1 == p2); // 结果是true,因为p1,p2是缓存中同一个对象

 延迟加载1

Person p1  =  (Person)s.load(Person. class " 00004 " ); // 取不到缓存中数据,lazy = true,不执行sql,所以不出异常
Person p2  =  (Person)s.load(Person. class " 00004 " ); // 取到缓存中数据,不出异常
    System.out.println(p1==p2);//结果是true,因为p1,p2是缓存中同一个对象
System.out.println(p1.getUserName());
//访问p1属性,执行sql,加载p1,数据库中不存在记录,则抛出ObjectNotFoundException异常

延迟加载2

Person p1  =  (Person)s.load(Person. class " 00004 " ); // 取不到缓存中数据,lazy = true,不执行sql,所以不出异常
Person p2  =  (Person)s.load(Person. class " 00004 " ); // 取到缓存中数据,不出异常
    System.out.println(p1==p2);//结果是true,因为p1,p2是缓存中同一个对象
System.out.println(p2.getUserName());
//访问p2属性,执行sql,加载p2,数据库中不存在记录,则抛出ObjectNotFoundException异常

 get方法直接访问数据库1

Person p1  =  (Person)s.get(Person. class " 00004 " ); //执行sql,如果 记录不存在,返回空指针null
Person p2  =  (Person)s.load(Person. class " 00004 " ); // 取不到缓存中数据,lazy = true ,不执行sql,所以不出异常
    System.out.println(p1==p2);//结果是false
System.out.println(p1.getUserName()); // p1记录为null,抛出空指针异常

 get方法直接访问数据库2 

Person p1  =  (Person)s.get(Person. class " 00004 " ); //执行sql,如果 记录不存在,返回空指针null
Person p2  =  (Person)s.load(Person. class " 00004 " ); // 取不到缓存中数据,lazy = true ,不执行sql,所以不出异常
    System.out.println(p1==p2);//结果是false
System.out.println(p2.getUserName()); //访问p2属性,执行sql,加载p2,数据库中不存在记录,则抛出ObjectNotFoundException异常

 load方法1

Person p1  =  (Person)s.load(Person. class " 00004 " );//取不到缓存中数据,lazy = true ,不执行sql,所以不出异常
Person p2  =  (Person)s.get(Person. class " 00004 ");   //查缓存获得p1_proxy,访问p1属性,执行sql,加载p1,数据库中不存在记录,则抛出ObjectNotFoundException异常????还是使用p1时的proxy
   System.out.println(p1==
p2);//不执行,其实p1,p2是一个对象
System.out.println(p1.getUserName());//不执行

  load方法2

Person p1  =  (Person)s.load(Person. class " 00004 " );//取不到缓存中数据,lazy = true ,不执行sql,所以不出异常
Person p2  =  (Person)s.get(Person. class " 00004 ");   //查缓存获得p1_proxy,访问p1属性,执行sql,加载p1,数据库中不存在记录,则抛出ObjectNotFoundException异常????还是使用p1时的proxy
   System.out.println(p1==
p2);//不执行,其实p1,p2是一个对象
System.out.println(p2.getUserName());//不执行

 

Person p1  =  (Person)s.load(Person. class " 00004 " );//取不到缓存中数据,lazy = true ,不执行sql,所以不出异常
Person p2  =  (Person)s.get(Person. class " 00004 ");   //查缓存获得p1_proxy,访问p1属性,执行sql,加载p1,数据库中不存在记录,则抛出ObjectNotFoundException异常????还是使用p1时的proxy
   System.out.println(p1==
p2);//不执行,其实p1,p2是一个对象
System.out.println(p1.getUserName());//不执行

  get方法

Person p1  =  (Person)s.get(Person. class " 00004 " );//返回null
Person p2  =  (Person)s.get(Person. class " 00004 ");   //查缓存获得p1
   System.out.println(p1==
p2);//p1,p2是一个对象
System.out.println(p2.getUserName());//空指针异常

上面都是访问非主键属性,如果是访问主键的话是不会真正去查询数据库的,因为本身'00004'已经放在了缓存中.

4:org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/example/datamodel/Person.hbm.xml
hbm.xml中类路径应写全

5:org.hibernate.HibernateException: More than one row with the given identifier was found: 000002, for class: com.example.datamodel.Person
记录不唯一不能使用load 

 6:
临时状态 new Person(),new Person('aaa','000');
持久状态
游离状态 关闭se

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值