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 。