现在的位置: 首页 > 综合 > 正文

Hibernate之one-to-many XML 篇二

2013年11月17日 ⁄ 综合 ⁄ 共 3286字 ⁄ 字号 评论关闭

接着上一篇文章中所简单叙述的one-to-many双向关系的配置以及使用,上章记录到了cascade、lazy。这章将继续完成inverse、feth以及not-found的简述:

回顾上章User.hbm.xml中的Set配置,在这里新加了两项配置(fetch与inverse)
Hibernate之one-to-many <wbr>XML <wbr>篇二
首现Fetch的作用,其在查询时常使用到,表示的是使用什么查询方式来索引数据,默认属性值是select表示的是:使用基本的select查询操作,如下面的查询例子:

public static void ontToManySelect() {
SessionFactory factory = HibernateSessionFactory.getSessionFactory();
Session session = factory.openSession();
try {
// 获取User对象
User user = (User) session.get(User.class, 7);
System.out.println("User_Name:" + user.getUname());
// session.close();
if (user != null) {
// 获取User对象中的books集合数据
Iterator iter = user.getBooks().iterator();
while (iter.hasNext()) {
Book b = iter.next();
System.out.println("\t Book_Name:" + b.getBname());
}
}

} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
session.close();
}
}

在这个运行中Hibernate会发出两条Sql语句,一条是查询User,一条是查询Book(即:根据Book中的uid外键来作为条件去查询),Sql语句如下:
Hibernate: select user0_.uid as uid1_0_, user0_.uname as uname1_0_ from hibernate_db.user user0_ where user0_.uid=?
Hibernate: select books0_.buid as buid1_, books0_.bid as bid1_, books0_.bid as bid0_0_, books0_.buid as buid0_0_, books0_.bname as bname0_0_ from hibernate_db.book books0_ where books0_.buid=?
当然fetch还可以设置为join,顾名思义,join就是联合查询,当设置为该属性值的时候Hibernate将使用一条查询语句联合查询出来,Sql语句如下:
Hibernate: select user0_.uid as uid1_1_, user0_.uname as uname1_1_, books1_.buid as buid3_, books1_.bid as bid3_, books1_.bid as bid0_0_, books1_.buid as buid0_0_, books1_.bname as bname0_0_ from hibernate_db.user user0_ left outer join hibernate_db.book
books1_ on user0_.uid=books1_.buid where user0_.uid=?
综上所述 实际的配置中还得看在实际中遇到的情况来进行选择,不过Hibernate既然默认的是select自然有其的好处。

inverse这是一个比较繁琐的配置,说繁琐 只是针对我来说,当时是测试了好几个案例才 勉强摸出点门道,关于inverse其可以理解是:"关系的控制权",即:维护关联关系。Hibernate中其属性值默认的是false,
表示的是其有主动权,因为inverse可以理解:“是否被控制”的意思,即:当与它有关联的一个对象做出改变时,它也将相应的做出Update,如下面的案例:
给Set中的inserve设置为false;测试代码为:

public static void ontToManyAdd_User() {
// 获取Session/并打开事务
SessionFactory factory = HibernateSessionFactory.getSessionFactory();
Session session = factory.openSession();
Transaction st = session.beginTransaction();
try {

// 创建User对象
User user = new User();
user.setUname("A");

// 创建Book对象,并存储至Set集合中
Set book_set = new HashSet();
Book book1 = new Book();
book1.setBname("Java");
Book book2 = new Book();
book2.setBname("C++");
Book book3 = new Book();
book3.setBname("Net");

book_set.add(book1);
book_set.add(book2);
book_set.add(book3);

// 设置Book对象中的User对象属性 注意:一定要设置该属性如果不设定,将不能级联添加Book
book1.setUser(user);
book2.setUser(user);
book3.setUser(user);

user.setBooks(book_set);

session.save(user);
st.commit();
System.out.println("添加成功!");
} catch (Exception e) {
System.out.println(e.getMessage());
st.rollback();
} finally {
session.close();
}
}

这也还是上一章中所用测试用的级联添加;此时Hibernate的执行语句却是这样:

Hibernate: insert into hibernate_db.user (uname) values (?)
Hibernate: insert into hibernate_db.book (buid, bname) values (?, ?)
Hibernate: insert into hibernate_db.book (buid, bname) values (?, ?)
Hibernate: insert into hibernate_db.book (buid, bname) values (?, ?)
Hibernate: update hibernate_db.book set buid=? where bid=?
Hibernate: update hibernate_db.book set buid=? where bid=?
Hibernate: update hibernate_db.book set buid=? where bid=?
添加成功!

这里的黑色粗体部分,明显的表示了当添加一个用户并且级联添加Book完成后又对Book进行了Update。
              
        not-found在使用外键的时候常用到,即:像上面的many-to-one中,Book里面有User的外键,但是如果 外键为空的时候,查询Book就会出现查询不出的情况,所以可以设置not-fund="ignore"来处理,意思是忽略掉外键为空。如下图所示 :

当然not-found还可以设置其它的属性值,其默认的是not-found="exception",即:忽略异常!


至此,one-to-many双向关联已经大致简述完毕。一直坚信实践是成功的最好方式!有 名言: 业精于勤,荒于嬉。只有真正的去实际应用了才能了解其中的含义。这是本人Hibernate的开篇  若有幸
有大神看到了该文章,如有不妥之处,还望指导斧正~

抱歉!评论已关闭.