hibernate映射----多对一关联映射

hibernate映射----多对一关联映射_第1张图片
image.png
User类
public class User {
    
private int id;
private String name;
private Group group;
}

映射配置










含义:在t_user表中将增加groupid字段,该字段将从表t_group中的id字段取值(调用User实体的group属性所指的group实体的getId()方法)
在User表上建立了一个指向t_group表的外键关联

Group类
public class Group {
private int id;
private String name;

映射配置









生成的sql语句
create table t_group (id integer not null auto_increment, name varchar(255), primary key (id))
create table t_user (id integer not null auto_increment, name varchar(255), groupid integer, primary key (id))
  alter table t_user add index FKCB63CCB6B68CA22D (groupid), add constraint FKCB63CCB6B68CA22D foreign key (groupid) references t_group (id)

2、TransientObjectException异常分析

若执行以下代码:
session.save(user1);
session.save(user2);
会抛出TransientObjectException异常
原因分析:
因为Group为Transient状态,oid没有分配值
persistent状态的对象是不能引用transient状态的对象的
解决方案
在上述语句前增加session.save(group);
session.save(group);
session.save(user1);
session.save(user2);
在 User.hbm.xml 配置文件的many-to-one标签中增加cascade属性并让其值为all

3、级联对象的连锁操作

什么是级联?

两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作
如:

4、加载:代码分析

User user = (User)session.load(User.class,1);
System.out.println("user.name=" + user.getName());
System.out.println("user.group.name=" +user.getGroup().getName());

user.getGroup().getName())的含义为:先从表t_user找出id为1的记录,然后找出该记录的groupid的值,到t_group表中找出与之相同的id值,并取出该记录, 把该值放group对象中到group 的对象中,调用该对象的getName()方法,取出name值

你可能感兴趣的:(hibernate映射----多对一关联映射)