多対一恐怕是现实世界中存在的最普遍的一种关联关系了。
hibernate在解决多対一关联映射时提出了一种普遍的思想:在实体模型中通过“多”持有“一”的引用来反映这种关系,在关系模型中通过在“多”的一端增加个外加指向“一”的一端。其实,这种思想还常常用来解决一对一和多对多。
看看我们的User和Group的实例是怎么实现的吧:
1.实体模型:
2.关系模型:
3.实体类:
Group.java
public
class Group {
private int id;
private String name;
//一系列的setter.getter方法
@Override
public String toString() {
return "Group:"+name;
}
}
private int id;
private String name;
//一系列的setter.getter方法
@Override
public String toString() {
return "Group:"+name;
}
}
User.java
public
class User {
private int id;
private String name;
private Group group;
//一系列的setter.getter方法
@Override
public String toString() {
return "User:"+name;
}
}
private int id;
private String name;
private Group group;
//一系列的setter.getter方法
@Override
public String toString() {
return "User:"+name;
}
}
4.映射文件:
Group.hbm.xml
<
class
name
="com.sxt.hibernate.many2one.entity.Group"
table
="sxt_hibernate_group"
>
< id name ="id" length ="4" >
< generator class ="native" > </ generator >
</ id >
< property name ="name" length ="10" > </ property >
</ class >
< id name ="id" length ="4" >
< generator class ="native" > </ generator >
</ id >
< property name ="name" length ="10" > </ property >
</ class >
User.hbm.xml
<
class
name
="com.sxt.hibernate.many2one.entity.User"
table
="sxt_hibernate_user"
>
< id name ="id" length ="4" >
< generator class ="native" > </ generator >
</ id >
< property name ="name" length ="10" > </ property >
<!-- many-to-one含义,会在多的一端加入一个外键指向一的一端,以供加载时使用.外键由column属性指定,默认和实体属性名相同.
cascade操作本对象时级联操作它的关联对象 -->
< many-to-one name ="group" column ="group_id" cascade ="save-update" > </ many-to-one >
</ class >
< id name ="id" length ="4" >
< generator class ="native" > </ generator >
</ id >
< property name ="name" length ="10" > </ property >
<!-- many-to-one含义,会在多的一端加入一个外键指向一的一端,以供加载时使用.外键由column属性指定,默认和实体属性名相同.
cascade操作本对象时级联操作它的关联对象 -->
< many-to-one name ="group" column ="group_id" cascade ="save-update" > </ many-to-one >
</ class >
5.hibernate配置文件:
参照前面的。
6.测试方法:
public
static
void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入数据
*/
/* Group group = new Group();//情况1.生成一个新的组 g.setName("开发组");
group.setName("研发组");
User user1=new User();
user1.setName("奇隆");
user1.setGroup(group);
User user2=new User();
user2.setName("有朋");
user2.setGroup(group);
//这里也要保证在save(user)前,它所关联的group要先save或者在User的映射文件中配置上cascade级联save,.
session.save(user1);
session.save(user2);*/
/* Group group=(Group)session.get(Group.class, 2);//情况2.加载数据库中已经存在的组
User user=new User();
user.setName("谢霆锋");
user.setGroup(group);
//由于加载的group 已经是持久化的了,所以这样也能保存成功.
session.save(user);*/
/**
* 小结:保存user之前要保证它所引用对象已经是持久化的,这样在保存user时,hibernate会自动把user的外键指向group的id
*/
User user = (User) session.get(User. class, 3); // 只是加载了user对象和它所在组的对象group的id属性,并没有加载group对象
System.out.println(user);
System.out.println(user.getGroup());
/**
* 小结:可见,在"多"的一端(user)可以加载"一"的一端(group).当然,这里存在延迟加载策略,有时间专门讨论.
*/
session.save(user); //由于user已经是持久化的对象,并且没有做出修改,所以这里并不触发任何的sql操作
user.setName( "郑伊健");
session.save(user); //由于user已经做了改动,所以这里会触发update操作.
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入数据
*/
/* Group group = new Group();//情况1.生成一个新的组 g.setName("开发组");
group.setName("研发组");
User user1=new User();
user1.setName("奇隆");
user1.setGroup(group);
User user2=new User();
user2.setName("有朋");
user2.setGroup(group);
//这里也要保证在save(user)前,它所关联的group要先save或者在User的映射文件中配置上cascade级联save,.
session.save(user1);
session.save(user2);*/
/* Group group=(Group)session.get(Group.class, 2);//情况2.加载数据库中已经存在的组
User user=new User();
user.setName("谢霆锋");
user.setGroup(group);
//由于加载的group 已经是持久化的了,所以这样也能保存成功.
session.save(user);*/
/**
* 小结:保存user之前要保证它所引用对象已经是持久化的,这样在保存user时,hibernate会自动把user的外键指向group的id
*/
User user = (User) session.get(User. class, 3); // 只是加载了user对象和它所在组的对象group的id属性,并没有加载group对象
System.out.println(user);
System.out.println(user.getGroup());
/**
* 小结:可见,在"多"的一端(user)可以加载"一"的一端(group).当然,这里存在延迟加载策略,有时间专门讨论.
*/
session.save(user); //由于user已经是持久化的对象,并且没有做出修改,所以这里并不触发任何的sql操作
user.setName( "郑伊健");
session.save(user); //由于user已经做了改动,所以这里会触发update操作.
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
本文转自NightWolves 51CTO博客,原文链接:
http://blog.51cto.com/yangfei520/274832
,如需转载请自行联系原作者