Hibernate中的find是根据主键首先去缓存中查找,找到就直接返回,找不到就接着去数据库中查找;
而createQuery直接就去数据库中查找,不管缓存中是不是已经存在了;
两者一般情况下逻辑效果是一样的,只是性能上有些差别,但有些特定情况下就不同了。
输入一批“水表数据信息”,循环处理这些信息,当水表信息表示的水表不在数据库中时就根据这些信息构造水表实体存入数据库,输入的“水表数据信息”可能有相同的水表信息,这样就会有多次查找同样水表的查询,但他们返回的结果不应当是相同的,第一次没查到就新建一个,再次查询时应该能查到,否则水表就会重复了。这时候Hibernate find与普通createQuery的区别就显示出来了,新建后再find同样的水表就会查出刚刚建立的水表(虽然他还没有进入数据库,因为循环完后才commit),而createQuery每次查询结果都相同(查不到,因为数据库里没有该水表),这样就会新建多个相同的水表,导致数据库主键重复异常。
【编辑推荐】