全部博文(178)
分类: Java
2008-04-14 16:24:08
一個實體簡單的說就是在資料庫中擁有一個表格,並擁有自已的資料庫識別(Database identity)。 一個簡單的實體與實體間之關係為多對一的關係,例如在學校宿舍中,使用者與房間的關係就是多對一的關係,多個使用者可以居住於一個房間。 如上圖所示的,可以藉由room_id讓使用者與房間產生關聯,您可以如下建立user與room表格: create table room (
id bigint not null auto_increment, address varchar(255), primary key (id) ) create table user ( id bigint not null auto_increment, name varchar(255), room_id bigint, primary key (id) ) 用程式來表示的話,首先看看User類別:
package onlyfun.caterpillar; User類別中有一room屬性,將參考至Room實例,多個User實例可共同參考一個Room實例,Room類別設計如下:
package onlyfun.caterpillar; 在映射文件方面,先來看看Room.hbm.xml:
沒什麼,很簡單的一個映射文件,而在User.hbm.xml中,使用
在 一個儲存的例子如下: Room
room1 = new Room();
room1.setAddress("NTU-M8-419"); Room room2 = new Room(); room2.setAddress("NTU-G3-302"); User user1 = new User(); user1.setName("bush"); user1.setRoom(room1); User user2 = new User(); user2.setName("caterpillar"); user2.setRoom(room1); User user3 = new User(); user3.setName("momor"); user3.setRoom(room2); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); session.save(user1); // 主控方操作,被控方也會對應操作 session.save(user2); session.save(user3); tx.commit(); session.close(); 關於cascade,可以進一步參考 。 資料庫中將儲存以下的內容:
在查詢時的例子如下: Session session =
HibernateUtil.getSessionFactory().openSession();
User user = (User) session.load(User.class, new Long(1)); System.out.println(user.getName()); System.out.println(user.getRoom().getAddress()); session.close(); 在設定outer-join為true的情況下,Hibernate將使用以下的SQL一次查詢所有的資料: Hibernate:
select user0_.id as id0_1_, user0_.name as name0_1_, user0_.room_id as room3_0_1_, room1_.id as id1_0_, room1_.address as address1_0_ from user user0_ left outer join room room1_ on user0_.room_id=room1_.id where user0_.id=? 在不設定outer-join為true的情況下,Hibernate則使用以下的SQL分別查詢user與room表格: Hibernate:
select user0_.id as id0_0_, user0_.name as name0_0_, user0_.room_id as room3_0_0_ from user user0_ where user0_.id=? Hibernate: select room0_.id as id1_0_, room0_.address as address1_0_ from room room0_ where room0_.id=? |