hibernate的get(java.lang.Class arg0, java.io.Serializable arg1)

1.配置hibernate的双向关联,由多的一方控制

一的一方:

package com.hibernate;

import java.util.HashSet;
import java.util.Set;

public class Group {
 private int id;
 private String name;
 private Set<User> users=new HashSet<User>();
 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 Set<User> getUsers() {
  return users;
 }
 public void setUsers(Set<User> users) {
  this.users = users;
 }

}
对应的Group.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate">
 <class name="Group" table="t_group">
  <id name="id" type="int" column="id">
   <generator class="native"></generator>
  </id>
  <property name="name" type="string" column="name"></property>
  
  <set name="users" inverse="true">
   <key column="groupId" > </key>
   <one-to-many class="com.hibernate.User"/>
  </set>
  
 </class>
  
</hibernate-mapping>

多的一方:

package com.hibernate;

public class User {
 private int id;
 private String name;
 private Group group;
 
 
 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 Group getGroup() {
  return group;
 }
 public void setGroup(Group group) {
  this.group = group;
 }

}
对应的User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate">
 <class name="User" table="t_user">
 <id name="id" type="int" column="id">
  <generator class="native"></generator>
 </id>
 <property name="name" type="string" column="name"></property>
 <many-to-one name="group" column="groupId"></many-to-one>
 </class>
</hibernate-mapping>

 

测试类:

package com.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test9 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  SessionFactory sf=new Configuration().configure().buildSessionFactory();
  Session session=sf.openSession();
  Group g1=new Group();
  g1.setName("g1");
  
  Group g2=new Group();
  g2.setName("g2");
  
  User user1=new User();
  user1.setName("u1");
  user1.setGroup(g1);
  
  User user2=new User();
  user2.setName("u2");
  user2.setGroup(g2);
  
   Transaction tx=session.beginTransaction();
   session.save(g1);
   int id=g1.getId();
   System.out.println("id--"+id);
   session.save(g2);
   session.save(user1);
   session.save(user2);
   session.flush();
   tx.commit();

   //缓存?直接找到存在session里面的对象?
   Group g=(Group)session.get(Group.class, id);
   System.out.println("name---"+g.getName());
   System.out.println("s---"+g.getUsers().size());
   session.clear();
   
   int id2=g1.getId();
   System.out.println("id2--"+id2);
   //会产生 select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?
   Group gg2=(Group)session.get(Group.class, id2);
   System.out.println("gg2name---"+gg2.getName());
   //会产生 select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_,

//users0_.name as name4_0_, users0_.groupId as groupId4_0_

//from t_user users0_ 

 //where users0_.groupId=?
   System.out.println("gg2size---"+gg2.getUsers().size());
   
   session.close();

 }

}

 

后台的打印结果:

Hibernate: select hibernate_sequence.nextval from dual
id--95
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into t_group (name, id) values (?, ?)
Hibernate: insert into t_group (name, id) values (?, ?)
Hibernate: insert into t_user (name, groupId, id) values (?, ?, ?)
Hibernate: insert into t_user (name, groupId, id) values (?, ?, ?)
name---g1
s---0
id2--95
Hibernate: select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?
gg2name---g1
Hibernate: select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_, users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_ where users0_.groupId=?
gg2size---1

以上的结果可以看出

 当   session.clear();之前,session.save(g1); 在session中缓存了g1对象,

Group g=(Group)session.get(Group.class, id);在后台并没有打印SQL语句,我认为它是先在缓存中根据g1的主键找到g1这个对象,找到之后就没有去数据库中找。

所以System.out.println("name---"+g.getName());显示name---g1,
 System.out.println("s---"+g.getUsers().size());显示s---0。

当   session.clear();之后,清除了session里面的所有缓存,  Group gg2=(Group)session.get(Group.class, id2);在缓存中根据g1的主键伟找到对应的对象,然后根据id查询数据库里的数据,后台产生SQL语句Hibernate: select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?。

 System.out.println("gg2name---"+gg2.getName());显示gg2name---g1。

System.out.println("gg2size---"+gg2.getUsers().size());会在后台打印Hibernate: select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_, users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_ where users0_.groupId=?和gg2size---1

总结:

hibernate的get(java.lang.Class arg0, java.io.Serializable arg1)先根据arg1的值去找session缓存里面的对象,没有的话,才从数据库里去select 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值