
User类
public class User {
private int id;
private String name;
private Group group;
}
映射配置
<hibernate-mapping>
<class name="com.zte.hibernate.User" table="t_user">
<id name="id">
<generator class=“native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>
<many-to-one name="group" column="groupid"/>含义:在t_user表中将增加groupid字段,该字段将从表t_group中的id字段取值(调用User实体的group属性所指的group实体的getId()方法)
在User表上建立了一个指向t_group表的外键关联
Group类
public class Group {
private int id;
private String name;
映射配置
<hibernate-mapping>
<class name="com.zte.hibernate.Group" table="t_group">
<id name="id">
<generator class=“native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
生成的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
<many-to-one name="group" column="groupid" cascade="all"/>
3、级联对象的连锁操作
什么是级联?
两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作
如:<many-to-one name=“group” column=“groupid” cascade=“all”/>
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值
网友评论