Java ee 企業(yè)應(yīng)用開發(fā):第6章 購物車_第1頁
Java ee 企業(yè)應(yīng)用開發(fā):第6章 購物車_第2頁
Java ee 企業(yè)應(yīng)用開發(fā):第6章 購物車_第3頁
Java ee 企業(yè)應(yīng)用開發(fā):第6章 購物車_第4頁
Java ee 企業(yè)應(yīng)用開發(fā):第6章 購物車_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第6章 購物車6.1 開發(fā)步驟6.2 知識(shí)點(diǎn):Hibernate:數(shù)據(jù)關(guān)聯(lián)6.3 知識(shí)點(diǎn):Hibernate:數(shù)據(jù)加載方式第6章 購物車當(dāng)用戶瀏覽到滿意的圖書時(shí),可以選擇數(shù)量,并點(diǎn)擊購買按鈕,將圖書放入服務(wù)器的內(nèi)存中,如圖6-1所示。圖6-1 瀏覽商品,添加到購物車第6章 購物車用戶可以隨時(shí)點(diǎn)擊購物車,以顯示往購物車中存放的書籍。顯示購物車的內(nèi)容,如圖6-2所示。圖6-2 顯示購物車第6章 購物車當(dāng)用戶結(jié)帳時(shí),將用戶在購物車中購買的商品放入數(shù)據(jù)庫中,并給用戶一個(gè)帳號(hào),可以去查詢。如果用戶沒有登錄,則不能進(jìn)行結(jié)帳功能。圖6-3 結(jié)帳6.1 開發(fā)步驟6.1.1 添加到購物車開發(fā)的步驟:步驟1:創(chuàng)建

2、購物車模型步驟2:DAO步驟3:Service步驟4:Action步驟5:Spring步驟6:JSP具體操作如下:步驟1 創(chuàng)建購物車模型購物車模型Cart如圖6-4所示。圖6-4 購物車模型6.1.1 添加到購物車購物車所在的位置,如圖6-5所示。圖6-5 購物車模型所在位置6.1.1 添加到購物車Cart.javapackage org.apex.ookstore.model;public class Cart protected Map items; public Cart() if(items= =null) items=new HashMap(); public void addBoo

3、k(Integer bookid,Orderitem orderitem)/是否存在,如果存在,更改數(shù)量/如果不存在的話,添加入集合if(items.countainsKey(“bookid”) Orderitem _orderitem=items.get(bookid); _orderitem.setQuantity(_orderitem.getOrderitemid()+orderitem.getQuantity(); items.put(bookid,_orderitem);else items.put(bookid,orderitem);6.1.1 添加到購物車 /更新購物車的數(shù)量pu

4、blic void updateCart(Integer bookid, Orderitem orderitem) items.put(bookid,orderitem);/覆蓋/計(jì)算總價(jià)格public int getTotalPrice() int totalPrice=0; for(Iterator it=items.values().iterator();it.hasNext();) Orderitem orderitem=(Orderitem)it.next(); Book book=orderitem.getBook(); int quantity=orderitem.getQuan

5、tity(); totalPrice+=book.getPrice()*quantity; return totalPrice; 6.1.1 添加到購物車步驟2 DAODAO層主要的類為BaseDAO類,IBookDAO接口和BookDAO類。在IBookDAO中定義了getBookById()方法,通過這個(gè)方法可以根據(jù)id號(hào),得到書的信息。BookDAO具體實(shí)現(xiàn)了這個(gè)接口。如圖6-6所示。圖6-6 DAO主要類6.1.1 添加到購物車這些類在項(xiàng)目中的位置如圖6-7所示。圖6-7 文件在項(xiàng)目中的位置6.1.1 添加到購物車IBookDAO.javapackage org.apex.bookst

6、ore.dao;import java.util.List;import org.bookstore.vo.Book;public interface IBookDAO public List getBookByCatalogid(Integer catalogid);public List getBookByCatalogidPaging(Integer catalogid,int currentPage,int pageSize);public int getTotalByCatalog(Integer catalogid);public Book getBookById(Integer

7、bookid);修改BookDAO.javapublic Book getBookById(Integer bookid)Session session=getSession();Book book=(Book)session.get(Book.class, bookid);session.close();return book;6.1.1 添加到購物車步驟3 Service圖6-8 Service層主要類圖6.1.1 添加到購物車文件在項(xiàng)目中的位置如圖6-9所示。圖6-9 文件在項(xiàng)目中的位置6.1.1 添加到購物車IBookService.javapackage org.apex.books

8、tore.service;import java.util.List;import org.apex.bookstore.vo.Book;public interface IBookService public List getBookByCatalogid(Integer catalogid);public List getBookByCatalogidPaging(Integer catalogid,int currentPage,int pageSize);public int getTotalByCatalog(Integer catalogid);public Book getBoo

9、kById(Integer bookid);BookService.javapublic Book getBookById(Integer bookid)return bookDAO.getBookById(bookid);6.1.1 添加到購物車步驟4 ActionShoppingAction通過addToCart()方法,完成將圖書放入購物車的業(yè)務(wù)邏輯。類圖如圖6-10所示。圖6-10 主要類圖6.1.1 添加到購物車文件在項(xiàng)目中的位置如圖6-11所示。圖6-11 文件在項(xiàng)目中的位置6.1.1 添加到購物車創(chuàng)建ShoppingAction.java步驟5 Springapplication

10、Context.xml 步驟6 JSPbrowseBookPaging.jsp用來進(jìn)行分頁瀏覽。圖6-12 文件在項(xiàng)目中的位置6.1.1 添加到購物修改browseBookPaging.jsp img src=/bookstore/picture/ width=100 書名: 價(jià)格:元 數(shù)量: input type=hidden value= name=”bookid” 創(chuàng)建addToCart_success.jspinput type=hidden value= 6.1.1 添加到購物修改BookAction.java;public String browseBookPaging() thr

11、ows ExceptionSystem.out.println(why?);int totalSize=bookService.getTotalByCatalog(catalogid);Pager pager=new Pager(currentPage,totalSize);/List books=bookService.getBookByCatalogid(catalogid);List books=bookService.getBookByCatalogidPaging(catalogid, currentPage, pager.getPageSize();Map request=(Map

12、)ActionContext.getContext().get(request);request.put(books, books);request.put(pager,pager);/購物車要返回時(shí),需要記住返回的地址Map session=ActionContext.getContext().getSession();request.put(catalogid,catalogid);return SUCCESS;6.1.2 顯示購物車開發(fā)的步驟:步驟1: Model步驟2:Action步驟3:Spring步驟4:JSP具體操作如下:步驟1 ModelCart模型中的updateCart方法

13、用于更新購物車。如圖6-4所示,位置在6-5所示。修改Cart.java步驟2 ActionShoppingAction中的UpdateCart用于完成更新購物車的功能。修改shoppingAction.javapublic String updateCart() throws ExceptionMap session=ActionContext.getContext().getSession();Cart cart=(Cart)session.get(cart);cart.updateCart(bookid, quantity);session.put(cart, cart);return

14、SUCCESS;6.1.2 顯示購物車配置struts.xml /showCart.jsp 步驟3 Spring步驟4 JSP修改head.jsp購物車創(chuàng)建showCart.jsp 您購物車上的商品: 書名: 價(jià)格: input type=hidden name=bookid value= 消費(fèi)金額: 對(duì)不起,您還沒有選購商品! 6.1.3 結(jié)帳開發(fā)的步驟:步驟1 DAO步驟2 Service步驟3 Action步驟4 Spring步驟5 JSP具體操作如下步驟1 DAO主要涉及的類和接口為IOrderDAO接口和OrderDAO類。IOrderDAO接口中定義了insertOrder方法,用

15、來將插入到order表和orderitem表中。6.1.3 結(jié)帳圖6-13 DAO類IOrderDAO.javapackage org.apex.bookstore.dao;import org.apex.bookstore.vo.Orders;public interface IOrderDAO public Orders insertOrder(Orders order);6.1.3 結(jié)帳OrderDAO.javapackage org.apex.bookstore.dao.impl;import org.apex.bookstore.dao.BaseDAO;import org.apex

16、.bookstore.dao.IOrderDAO;import org.apex.bookstore.vo.Orders;import org.hibernate.Session;import org.hibernate.Transaction;public class OrderDAO extends BaseDAO implements IOrderDAOpublic Orders saveOrder(Orders order) Session session = getSession(); Transaction tx = session.beginTransaction();sessi

17、on.save(order);mit();session.close();return order;6.1.3 結(jié)帳步驟2 ServiceService層主要的類和接口為接口IOrderService,這個(gè)接口定義了saveOrder方法,用于結(jié)帳。OrderService具體實(shí)現(xiàn)了這個(gè)接口。圖6-14 Service層主要類圖6.1.3 結(jié)帳創(chuàng)建IOrderService.javapackage org.apex.bookstore.service;import org.apex.bookstore.vo.Orders;public interface IOrderService publi

18、c Orders saveOrder(Orders order);6.1.3 結(jié)帳創(chuàng)建OrderService.javapackage org.bookstore.service.impl;import org.apex.bookstore.dao.IOrderDAO;import org.apex.bookstore.service.IOrderService;import org.apex.bookstore.vo.Orders;public class OrderService implements IOrderService private IOrderDAO orderDAO;pub

19、lic void setOrderDAO(IOrderDAO orderDAO) this.orderDAO = orderDAO;public Orders saveOrder(Orders order) return orderDAO.saveOrder(order);6.1.3 結(jié)帳步驟3:Action使用ShoppingAction類的checkOut()完成結(jié)帳功能,類圖如圖6-10所示。修改ShoppingAction.javapublic String checkout() throws ExceptionMap session=ActionContext.getContext(

20、).getSession();User user=(User)session.get(user);Cart cart=(Cart)session.get(cart); if(user=null | cart=null) return ERROR;Orders order=new Orders();order.setOrderdate(new Date();order.setUser(user);for(Iterator it =cart.getItems().values().iterator();it.hasNext();) Orderitem orderitem=(Orderitem)it

21、.next(); orderitem.setOrders(order); order.getOrderitems().add(orderitem);orderService.saveOrder(order);Map request=(Map)ActionContext.getContext().get(request);request.put(order,order);return SUCCESS;6.1.3 結(jié)帳配置struts.xml /jsp/checkout_success.jsp步驟4 SpringapplicationContext.xml 6.1.3 結(jié)帳步驟5 JSP修改sho

22、wCart.jsp結(jié)帳創(chuàng)建checkout_success.jsp訂單添加成功,您的訂單已經(jīng)下達(dá), 您的訂單號(hào),我們會(huì)在三日內(nèi)寄送圖書給您!退出登錄注意點(diǎn):這時(shí)運(yùn)行程序會(huì)出現(xiàn)錯(cuò)誤,需要修改 修改Order.hbm.xml6.2 知識(shí)點(diǎn):HIBERNATE:數(shù)據(jù)關(guān)聯(lián)6.2.1 多對(duì)一實(shí)體與實(shí)體間的關(guān)系為多對(duì)一的關(guān)系,在現(xiàn)實(shí)中很常見。例如,在學(xué)校宿舍管理中,學(xué)生作為使用者User與房間Room的關(guān)系就是多對(duì)一的關(guān)系,多個(gè)學(xué)生使用一個(gè)房間。圖6-15 實(shí)體多對(duì)一關(guān)聯(lián)6.2.1 多對(duì)一 如圖所示,可以借room_id讓使用者與房間產(chǎn)生關(guān)聯(lián),可以建立如下的user和room表格:CREATE TABLE

23、 user( id INT(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(100) NOT NULL default , room_id INT(11);CREATE TABLE room( id INT(11) NOT NULL auto_increment PRIMARY KEY address VARCHAR(100) NOT NULL default );用程序來表示的話,User類如下public class User private Integer id; private Sstring name; private Ro

24、om room; 6.2.1 多對(duì)一User類中有一個(gè)room屬性,將參考Room實(shí)例,多個(gè)User實(shí)例可共同參考一個(gè)Room實(shí)例,Room類代碼如下:public class Room private Integer id; private String address; 映射文件Room.hbm.xml 6.2.1 多對(duì)一很簡(jiǎn)單的一個(gè)映射文件,而在user.hbm.xml中,使用來標(biāo)識(shí)映射多對(duì)一關(guān)系: 6.2.1 多對(duì)一在的設(shè)定中,cascade表示主控方(User)進(jìn)行save,update,delete等相關(guān)操作時(shí),被控方(Room)是否也要進(jìn)行相關(guān)操作.即,存儲(chǔ)或更新User實(shí)例時(shí),

25、當(dāng)中的Room實(shí)例是否也一起對(duì)數(shù)據(jù)庫發(fā)生存儲(chǔ)或更新操作,設(shè)定為all,表示主控方進(jìn)行任何操作,被空方也進(jìn)行對(duì)應(yīng)操作.下面是一個(gè)存儲(chǔ)的例子:Room room1=new Room();Room room2=new Room();User user1=new User();User user2=new User();User user3=new User();room1.setAddress(“NTU-M8-419”);room2.setAddress(“NTU-G3-302”);user1.setName(“bush”);user1.setRoom(room1);user2.setName(“T

26、om”);user2.setRoom(room2);user3.setName(“Grace”);user3.setRoom(room2);6.2.1 多對(duì)一Session session=sessionFactory.openSession();Transaction tx=session.beginTransaction();session.save(user1); /主控方操作,被控方也會(huì)對(duì)應(yīng)操作。session.save(user2);session.save(user3);mit();session.close();最后的結(jié)果是,room表格插入了兩條記錄roomid address

27、1 NTU-M8-4192 NTU-G3-302userid name room_id1 bush 12 Tom 13 Grace 26.2.1 多對(duì)一在Hibernate映像文件中,cascade屬性的設(shè)置映像程序的編寫,cascade屬性預(yù)設(shè)值是none。以多對(duì)一的范例來看,如果設(shè)定cascade不為true,則必須分別對(duì)User實(shí)例與Room實(shí)例進(jìn)行存儲(chǔ),如下:session.save(room1); /存儲(chǔ)Room實(shí)例session.save(room2);session.save(user1); /存儲(chǔ)User實(shí)例session.save(user2);session.save(us

28、er3);6.2.2 一對(duì)多多對(duì)一的關(guān)系反過來就是一對(duì)多的關(guān)系,一對(duì)多關(guān)系在系統(tǒng)實(shí)現(xiàn)中也很常見。典型的例子就是父親與孩子的關(guān)系、房間與使用者的關(guān)系。在下面的示例中,每個(gè)Room都關(guān)聯(lián)到多個(gè)User,即一個(gè)房間可以多人居住。圖6-16 一對(duì)多6.2.2 一對(duì)多User.javapublic class User private Integer id; private String name; 而在Room類別中,使用Set來記錄多個(gè)Userpublic class Room private Integer id; private String address; private Set users

29、; 這種方式即所謂單向一對(duì)多關(guān)系,也就是Room實(shí)例知道User實(shí)例的存在,而User實(shí)例則沒有意識(shí)到Room實(shí)例。(在多對(duì)一中,則是單向多對(duì)一關(guān)系,即User知道Room的存在,但Room不知道User的存在。)6.2.2 一對(duì)多在映射文件上,user.hbm.xml: 在單向關(guān)系中,被參考的對(duì)象其映射文件就如單一實(shí)例一樣的配置,接下來看看room.hbm.xml,使用標(biāo)識(shí)配置一對(duì)多:Room.hbm.xml 6.2.2 一對(duì)多可以如下存儲(chǔ)實(shí)例:User user1 = new User();User user2=new User();User user3=new User();Room r

30、oom1=new Room();Room room2=new Room();user1.setName(bush); user2.setName(tom); user3.setName(grace); room1.setUsers(new HashSet();room1.setAddress(NTU-M8-419);room1.addUser(user1);room1.addUser(user2); room2.setUsers(new HashSet();room2.setAddress(NTU-G3-302);room2.addUser(user3); Session session =

31、sessionFactory.openSession();Transaction tx = session.beginTransaction();session.save(room1); / cascade 操作session.save(room2); mit();session.close();6.2.2 一對(duì)多在數(shù)據(jù)庫中將存儲(chǔ)以下的表格id name room_id 1 bush 1 2 tom 1 3| grace 2 rommid address1 NTU-M8-4192 NTU-G3-3026.2.3 雙向關(guān)聯(lián)在多對(duì)一,一對(duì)多中都是單向關(guān)聯(lián),也就是其中一方關(guān)聯(lián)到另一方,而另一方不知道

32、自己被關(guān)聯(lián)。如果讓雙方都意識(shí)到另一方的存在,就形成了雙向關(guān)聯(lián),在多對(duì)一,一對(duì)多的例子改寫以下,重新設(shè)計(jì)User類如下:圖6-17 雙向關(guān)聯(lián)6.2.3 雙向關(guān)聯(lián)public class User private Integer id; private String name; private Room room; Room類如下:public class Room private Integer id; private String address; private Set users; 6.2.3 雙向關(guān)聯(lián)這樣,User實(shí)例可參考Room實(shí)例而維持多對(duì)一關(guān)系,而Room實(shí)例記得User實(shí)例而維

33、持一對(duì)多關(guān)系。在映射文件User.hbm.xml: 6.2.3 雙向關(guān)聯(lián)Room.hbm.xml 6.2.3 雙向關(guān)聯(lián)映射文件雙方都設(shè)定了cascade為save-update,所以可以用多對(duì)一的方式來維持關(guān)聯(lián):User user1 = new User();User user2=new User();Room roo1=new Room();user1.setName(bush); user2.setName(caterpillar); room1.setAddress(NTU-M8-419);user1.setRoom(room1);user2.setRoom(room1); Sessio

34、n session = sessionFactory.openSession();Transaction tx = session.beginTransaction();session.save(user1);session.save(user2);mit();session.close();6.2.3 雙向關(guān)聯(lián)或者反過來由一對(duì)多的方式來維持關(guān)聯(lián):User user1 = new User();User user2=new User();Room room1=new Room();user1.setName(bush); user2.setName(caterpillar); room1.se

35、tUsers(new HashSet();room1.setAddress(NTU-M8-419);room1.addUser(user1);room1.addUser(user2); Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();session.save(room1); mit();session.close();6.2.3 雙向關(guān)聯(lián)這里有個(gè)效率問題可以討論,上面程序Hibernate將使用以下的SQL進(jìn)行存儲(chǔ):Hibernate: insert into

36、room (address) values (?)Hibernate: insert into user (name, room_id) values (?, ?)Hibernate: insert into user (name, room_id) values (?, ?)Hibernate: update user set room_id=? where id=?Hibernate: update user set room_id=? where id=?上面的寫法標(biāo)識(shí)關(guān)聯(lián)由Room單方面維護(hù),而主控方也是Room。User不知道Room的room_id是多少,所以必須分別存儲(chǔ)Room與

37、User之后,再更新user的room_id。在一對(duì)多,多對(duì)一形成雙向關(guān)聯(lián)的情況下,可以將關(guān)聯(lián)維持的控制交給多的一方。這樣會(huì)比較有效率。理由不難理解,就像在公司中,老板要記住所有員工的名字慢,每一個(gè)員工都記住老板的名字快。6.2.3 雙向關(guān)聯(lián)所以在一對(duì)多,多對(duì)一形成雙向關(guān)聯(lián)的情況下,可以在“一”的一方設(shè)定控制反轉(zhuǎn),也就是當(dāng)存儲(chǔ)“一”的一方時(shí),將關(guān)聯(lián)維持的控制權(quán)交給“多”的一方。就上面的例子來說,可以設(shè)定room.hbm.xml如下: 6.2.3 雙向關(guān)聯(lián)由于關(guān)聯(lián)的控制交給“多”的一方,所以直接存儲(chǔ)“一”方前,“多”的一方必須意識(shí)到“一”的存在,所以程序修改如下:User user1 = new

38、 User();User user2 = new User(); Room room1 = new Room(); user1.setName(bush); user2.setName(tom); room1.setUsers(new HashSet();room1.setAddress(NTU-M8-419);room1.addUser(user1);room1.addUser(user2);/多方必須意識(shí)到單方的存在user1.setRoom(room1);user2.setRoom(room1); Session session = sessionFactory.openSession(

39、);Transaction tx = session.beginTransaction();session.save(room1); mit();session.close();上面的程序Hibernate將使用以下的SQL:Hibernate: insert into room (address) values (?)Hibernate: insert into user (name, room_id) values (?, ?)Hibernate: insert into user (name, room_id) values (?, ?)6.2.4 一對(duì)一 一對(duì)一關(guān)聯(lián)在Hibernate

40、中有兩種方式:主鍵關(guān)聯(lián)和唯一外鍵關(guān)聯(lián)。1主鍵關(guān)聯(lián)不需借助外部字段,直接通過兩個(gè)表的主鍵進(jìn)行關(guān)聯(lián)。此時(shí),必須保證兩個(gè)表的主鍵值一致。在Hibernate中,通常借助foreign標(biāo)識(shí)符生成器策略來完成。簡(jiǎn)單地說,這種情況是兩個(gè)表的主鍵相等的內(nèi)連接。基于主鍵關(guān)聯(lián)的單向一對(duì)一關(guān)聯(lián)通常使用一個(gè)特定的id生成器foreign。例如,User和Room對(duì)象就是一對(duì)一的關(guān)系。一個(gè)人只有一個(gè)房間,一房間只有一個(gè)人。數(shù)據(jù)庫中創(chuàng)建表的SQL語句如下:CREATE TABLE user( id INT(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(100

41、) NOT NULL default );CREATE TABLE room( id INT(11) NOT NULL auto_increment PRIMARY KEY, address VARCHAR(100) NOT NULL default );6.2.4 一對(duì)一圖6-18 一對(duì)一6.2.4 一對(duì)一User.hbm.xml Room.hbm.xml user 6.2.4 一對(duì)一Room的id主鍵,使用foreign表示與外鍵共享主鍵,即與User實(shí)體共享主鍵。Constrained設(shè)定為true,表示約束room的主鍵必須與user中對(duì)應(yīng)數(shù)據(jù)的主鍵相同。一個(gè)存儲(chǔ)的實(shí)例如下:User

42、user1=new User();Room room1=new Room();user1.setName(“bush”);room1.setAddress(“NTU-L8-219”);/相互設(shè)定關(guān)聯(lián)user1.setRoom(room1);room1.setUser(user1);Session session=sessionFactory.openSession();Transaction tx=session.beginTransaction();session.save(user1);2唯一外鍵關(guān)聯(lián)在主動(dòng)方加入外鍵進(jìn)行關(guān)聯(lián),這樣主動(dòng)方與被動(dòng)方的影射關(guān)系實(shí)際上就成為了多對(duì)一的關(guān)聯(lián)?;谕怄I

43、關(guān)系的單向一對(duì)一關(guān)聯(lián)和單向多對(duì)一關(guān)聯(lián)幾乎是一樣的。唯一的不同是單向一對(duì)一關(guān)聯(lián)中的外鍵具有唯一性約束。6.2.5 多對(duì)多作者BookAuthor可以擁有一系列的書Book,而某個(gè)Book也可以屬于不同的作者BookAuthor(合作寫的書)。這個(gè)關(guān)聯(lián)是雙向的,而且關(guān)聯(lián)的兩端都是“多“。稱之為多對(duì)多關(guān)聯(lián)。對(duì)于多對(duì)多關(guān)聯(lián)的實(shí)現(xiàn)一般有兩種可選方案:類似一對(duì)多情形中的最常用方案,為關(guān)聯(lián)的雙方增加到對(duì)方的外鍵。該方案的好處是取數(shù)據(jù)時(shí)不需要連接操作,只要讀一張表就可以,操作比較簡(jiǎn)單,缺點(diǎn)是會(huì)造成數(shù)據(jù)冗余。另一種方法是新增一張包含關(guān)聯(lián)雙方主鍵的關(guān)聯(lián)表。這時(shí)在讀取數(shù)據(jù)時(shí),需要連接該關(guān)聯(lián)表和數(shù)據(jù)表。優(yōu)點(diǎn)是沒有數(shù)據(jù)

44、冗余,缺點(diǎn)是帶來了一定實(shí)現(xiàn)復(fù)雜度。注意:由于多對(duì)多關(guān)聯(lián)的性能不佳,因此,在設(shè)計(jì)中應(yīng)該避免大量使用。6.3 知識(shí)點(diǎn):HIBERNATE:數(shù)據(jù)加載方式在傳統(tǒng)JDBC操作中,通常通過SQL語句加載所需的數(shù)據(jù)進(jìn)行處理,當(dāng)SQL提交之后,這些數(shù)據(jù)就被讀取待用。而在Hibernate世界里,擁有了更多的選擇(針對(duì)關(guān)聯(lián)數(shù)據(jù))。Hibernate支持以下數(shù)據(jù)加載方式:即時(shí)加載(Immediate Loading)當(dāng)實(shí)體加載完成之后,立即加載其關(guān)聯(lián)數(shù)據(jù)。延遲加載(Lazy Loading)實(shí)體加載時(shí),其關(guān)聯(lián)數(shù)據(jù)并非立刻獲取。而是當(dāng)關(guān)聯(lián)數(shù)據(jù)第一次被訪問時(shí)再進(jìn)行讀取。預(yù)先加載(Eager Loading)預(yù)先加載時(shí)

45、,實(shí)體及其關(guān)聯(lián)對(duì)象同時(shí)讀取,這與即時(shí)加載類似。不過實(shí)體及其關(guān)聯(lián)數(shù)據(jù)是通過一條SQL語句(基于外連接)同時(shí)讀取。批量加載(Batch Loading)對(duì)于即時(shí)加載和延遲加載,可以采用批量加載方式進(jìn)行性能上的優(yōu)化。下面,分別對(duì)幾種加載方式進(jìn)行介紹。即時(shí)加載(Immediate Loading)6.3 知識(shí)點(diǎn):HIBERNATE:數(shù)據(jù)加載方式在一對(duì)多映射的示例中,引入了用戶(User)及其地址(Address)的關(guān)聯(lián)示例。其中配置中,描述關(guān)聯(lián)關(guān)系的部分如下:set name=”address” table=”address” inverse=”true” cascade=”none” sort=”unsorted” lazy=”false”此時(shí)運(yùn)行如下代碼String hql=”from User where name=Tom”;List list=session.createQuery(hql).list();System.out.println(“Query finished.”);iterator it=list.iterator();while(it.hasNext()User user=(User)it.next();System.out.println(user.getName();System.out.println(user.getAddres

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論