Hibernate关联映射多对一关联介绍。many-to-one在多的一端加入一个外键,指向1的一端,该外键是由many-to-one里面column属性定义的,假如忽略了这个属性那默认的外键和实体的属性一致。
<many-to-one>标签的定义实例:<many-to-one name=”group” column=”groupid”/>。
hibernate多对一关联步骤:
建立POJO类:User.java与Group.java, 创建Hibernate配置文件,将两个hbm文件与其绑定。
在User.java里面建立一个Group类型的属性
在User的hbm文件中添加:
<many-to-one name=”group” column=”groupid”/> |
代码实现实例:
User.java:
public class User { private int id; private String name; private Group group; |
Group.java:
public class Group { private int id; private String name; |
User.hbm.xml:
Group.hbm.xml:
<hibernate-mapping> <class name=”Group” table=”t_group”> <id name=”id”> <generator class=”native”/> </id> <property name=”name”/> </class> </hibernate-mapping> |
测试类:
public class Many2OneTest extends TestCase { //保存1,不保存Group对象,保存User对象,保存出错 public void testSave1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Group group = new Group(); group.setName(“普通用户”); User user1 = new User(); user1.setName(“张三”); user1.setGroup(group);
User user2 = new User(); user2.setName(“李四”); user2.setGroup(group); //不能成功保存,抛出TransientObjectException异常 //因为Group为Transient状态,oid没有分配值, //persistent状态的对象是不能引用transient状态的对象的 //解决办法:先保存Group对象或在<many-to-one>标签中加入//cascade=”all” session.save(user1); session.save(user2); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); User user = (User)session.load(User.class, 3); System.out.println(“user.name=” + user.getName()); System.out.println(“user.group.name=” + user.getGroup().getName()); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } } |
重要属性cascade:
级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作
如上面测试many-to-one以及cascade属性的配置,
无cascade配置的User-Group执行代码
配置
<many-to-one name=“group” column=“groupid”/>
java代码:
Group group = new Group();
group.setName(“jkjk”); User user = new User(); user.setName(“管理员”); user.setGroup(group); session.save(user); |
执行结果:
抛出org.hibernate.TransientObjectException异常,以上代码中,group对象是一个瞬时对象,user对象引用了一个瞬时对象,所以在保存的时候出现异常。
添加了cascade=”all”配置,使得hibernate在管理对象的时候,对cascade对象执行了级联操作,就这样正确的保存。