hibernate中 session.save(实体类)方法的原理 15
我们知道hibernate中的session类中的save()方法可以将某一个实体类的对象存入数据库中,那么我想知道,session是如何判断传入的对象的真实的类型,并将...
我们知道hibernate中的session类中的save()方法可以将某一个实体类的对象存入数据库中,那么我想知道,session是如何判断传入的对象的真实的类型,并将其插入数据库中的?
例如:我有一个user对象,现在我想通过session中的save方法存储这个user对象,那么我需要这样写session.save(user);那么,我想问一下,session接收user对象后,它是如何知道user所属的类型,并解析user中的属性,然后将其插入到数据库中的?请注意,重点是session是如何判断user的本来类型的,解决这个问题就可以了,谢谢! 展开
例如:我有一个user对象,现在我想通过session中的save方法存储这个user对象,那么我需要这样写session.save(user);那么,我想问一下,session接收user对象后,它是如何知道user所属的类型,并解析user中的属性,然后将其插入到数据库中的?请注意,重点是session是如何判断user的本来类型的,解决这个问题就可以了,谢谢! 展开
5个回答
展开全部
当你用hibernate生成实体类的时候,无论是pojo还是注解,他都会对应指定数据库中的表,比如你的user对象,你new他的时候肯定是UserBean user = new UserBean();然后当你save的时候,他就会查找user对象的实体bean,这个时候查找pojo或者是注解的配置指向的那个表.字段名都是一一对应的.
更多追问追答
追问
请您详细的说明一下,它是如何根据传入的对象来找到user对象的试题bean?
追答
(1)把user对象加入到缓存中,使它变为持久化对象。
(2)选用映射文件指定的标识符生成器为持久化对象分配惟一的OID。比如user.hbm.xml文件中元素的子元素指定标识符生成器:
(3)计划执行一个insert语句,把user对象当前的属性值组装到insert语句中:
insert into CUSTOMERS(ID, NAME, ......) values(1, 'Tom', ......);
值得注意的是,save()方法并不立即执行SQL insert语句。只有当Session清理缓存时,才会执行SQL insert语句。如果在save()方法之后,又修改了持久化对象的属性,这会使得Session在清理缓存时,额外执行SQL update语句。以下两段代码尽管都能完成相同的功能,但是左边代码仅执行一条SQL insert语句,而右边代码执行一条SQL insert和一条SQL update语句。第一种代码减少了操作数据库的次数,具有更好的运行性能。
UserBean user = new UserBean();
// 先设置Customer对象的属性,再保存它
user .setName("Tom");
user .save(user );
transaction.commit();
UserBean user= new UserBean();
session.save(user );
// 先保存Customer对象,再修改它的属性
user .setName("Tom");
transaction.commit();
展开全部
你要有类才能去存类
User user,这个User类创建的时候,就需要注入hibernate的注解了
先是通过User这个类和数据库那张user表相连
所以你save一个user的时候,他是先找User这个类,然后通过这个类,通过这个类找到那张表,然后才存过数据库
User user,这个User类创建的时候,就需要注入hibernate的注解了
先是通过User这个类和数据库那张user表相连
所以你save一个user的时候,他是先找User这个类,然后通过这个类,通过这个类找到那张表,然后才存过数据库
追问
所以你save一个user的时候,他是先找User这个类
请您详细解释一下它是如何找到它原本所属的类的
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
User.hbm.xml 中 对象与表格的对应关系都 写好了,如果你是注解也是一个意思,最后就是组装sql的事情了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最近看到hibernate源码,也在纠结同样的为什么,有答案可以分享一下吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以进去看下源码。简单的说就是通过反射。
更多追问追答
追问
源码已看,由于session就是一个接口,其中的save方法就是一个接口的方法,并没有实际的业务逻辑,我现在要找的是它实际的业务逻辑,如何判断user所属的类型,您说反射,我了解了一些,请您根据我的问题详细说说它的存储的过程,谢谢!
追答
根据序列号和实体名称加上实体上的注解去找到传入 的本来类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询