三、持久層框架(Hibernate)
一、Hibernate處理關系
關系主要有三種:1、多對一 2、一對多 3、多對多
1、多對一
一個Product對應一個Category,一個Category對應多個Product(一個產品對應一個類別,一個類別對應多個產品)
也就是Product和Category是多對一的關系。(多個產品對應一個類別)
1.1在數據test下創建表category_table,兩個字段,id(自增),字符串格式name
其實也不用建表,因為Hibernate會自動建表。
use test; CREATE TABLE category_ table( id int(11) NOT NULL AUTO_INCREMENT, nameView Codevarchar(30) , PRIMARY KEY (id) ) DEFAULT CHARSET=UTF8;
1.2、準備類別實體類(Category.java)
package com.demo.pojo public class Category{ private int id;//類別id private String name;//類別名稱 //屬性的getter/setter方法 public int getId(){ return id; } public void setId(int id){View Codethis.id=id; } public String getName(){ return name; } public void setName(String name){ this.name=name; } }
1.3、準備類別實體類的映射xml(Category.hbm.xml)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"View Code> <hibernate-mapping package="com.how2java.pojo"> <class name="Category" table="category_table"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> </class> </hibernate-mapping>
1.4、為產品實體類(Product.java)增加Category屬性
package com.how2java.pojo; public class Product { int id; String name; float price; //增加Category的屬性 Category category; public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }View Code
1.5、為產品映射xml文件(Product.hbm.xml)設置Category多對一關系
<many-to-one name="category" class="Category" column="cid" />
使用many-to-one標簽設置多對一關系,name="category",對應Product類中的category屬性
class="Category"表示對應Category類,column="cid"表示指向category_table的外鍵。
具體配置xml如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.how2java.pojo"> <class name="Product" table="product_"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <property name="price" /> <many-to-one name="category" class="Category" column="cid" /> </class> </hibernate-mapping>View Code
1.6、在hibernate.cfg.xml中增加Category的映射文件
<?xml version=‘1.0‘ encoding=‘utf-8‘?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=GBK</property> <property name="connection.username">root</property> <property name="connection.password">admin</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <!--Product實體類的映射文件--> <mapping resource="com/demo/pojo/Product.hbm.xml" /> <!--Category實體類的映射文件--> <mapping resource="com/demo/pojo/Category.hbm.xml" /> </session-factory> </hibernate-configuration>View Code
1.7測試many-to-one多對一關系
package com.demo.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.demo.pojo.Product; public class TestHibernate{ public static void main(String[] args){ SessionFactory sf=new Configuration().configure().buildSessionFactory(); Session session=sf.opneSession(); session.beginTransaction(); Category category=new Category(); category.setName("car"); session.save(category); Product product=(Product)s.get(Product.clas,5);//獲取id=5的產品 product.setCategory(category);//把類別設置到產品的實體類中 session.update(p); session.getTransaction().commint(); session.close(); sf.close(); } }View Code
2、一對多
Category和Product是一對多關系(一個Category對應多個Product)
2.1、給Category實體類增加一個Set集合(無序的Product)
package com.demo.pojo import java.util.Set; public class Category{ private int id;//類別id private String name;//類別名稱 //屬性的getter/setter方法 public int getId(){ return id; } public void setId(int id){ this.id=id; } public String getName(){ return name; } public void setName(String name){ this.name=name; } //設置Product的Set Set<Product> products; public Set<Product> getProducts(){ return products; } public void SetProducts(Set<Product> products){ this.products=products; } }View Code
2.2、給Category.hbm.xml增加one-to-many映射
<set name="products" lazy="false"> <key column="cid" not-null="false"/> <ont-to-many class="Product"/> </set>
set標簽用於設置一對多關系,也可以設置多對多。
name="products"對應Category類中的products屬性,lazy="false",表示不使用延遲加載
<key colum="cid" not-null="false"/>表示外鍵是cid,可以為空
<one-to-many class="Product"/>表示一對多對應的類是Product
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.how2java.pojo"> <class name="Category" table="category_"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <!--set標簽設置一對多關系--> <set name="products" lazy="false"> <key column="cid" not-null="false" /> <one-to-many class="Product" /> </set> </class> </hibernate-mapping>View Code
2.3、測試one-to-many關系
首先獲取id=i的category,然後通過getProducts()獲取所對應的所有的product
package com.demo.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.demo.pojo.Product; public class TestHibernate{ public static void main(String[] args){ SessionFactory sf=new Configuration().configure().buildSessionFactory(); Session session=sf.opneSession(); session.beginTransaction(); Category category=new Category(); category.setName("car"); session.save(category); Category category=(Category)session.get(Category.class,1);//獲取id=1的類別 Set<Product> set=c.getProducts();//獲取產品的集合 for(Product p:set){//遍歷產品集合 System.out.println(p.getName()); } session.getTransaction().commint(); session.close(); sf.close(); } }View Code
3、多對多
一種product可以被多個User購買,一個User可以購買多種Product
所以Product和User之間關系是多對多many-to-many
要實現多對多關系,必須要有一張中間表,user_product用於維護User和Product之間的關系
3.1、User的實體類(User.java)
增加Product集合
package com.demo.pojo; import java.util.Set; public class User{ private int id;//用戶id private String name;//用戶名 Set<Product> products;//產品 //屬性的getter/setter方法 public int getId(){ return id; } public void setId(int id){ this.id=id; } public int getName(){ return name; } public void setName(String name){ this.name=name; } //設置Product的Set public Set<Product> getProducts(){ return products; } public void setProducts(Set<Product> products){ this.products=products; } }View Code
3.2、User.hbm.xml映射文件xml的編寫
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.how2java.pojo"> <class name="User" table="user_"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <!--配置Product與User的多對多關系,中間表是user_product--> <set name="products" table="user_product" lazy="false"> <key column="uid" /> <many-to-many column="pid" class="Product" /> </set> </class> </hibernate-mapping>View Code
3.3、Product的實體類(Product.java)
增加User的集合
package com.demo.pojo; import java.util.Set; public class Product{ private int id; private String name; private float price; Category category;//一對多 Set<User> users;//多對多 //屬性的getter/setter方法 public int getId(){ return id; } public void setId(int id){ this.id=id; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public float getPrice(){ return price; } public void setPrice(float price){ this.price=price; } //Category public Category getCategory(){ return category; } public void setCategory(Category category){ this.category=category; } //Set<User> public Set<User> getUser(){ return users; } public vodi setUser(Set<User> users){ this.users=users; } }View Code
3.4、Product的映射文件配置(Product.hbm.xml)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.how2java.pojo"> <class name="Product" table="product_"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <property name="price" /> <!--多對一--> <many-to-one name="category" class="Category" column="cid" /> <!-- 多對多--> <set name="users" table="user_product" lazy="false"> <key column="pid" /> <many-to-many column="uid" class="User" /> </set> </class> </hibernate-mapping>View Code
3.5、在hibernate.cfg.xml中增加User.hbm.xml的映射
<?xml version=‘1.0‘ encoding=‘utf-8‘?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=GBK</property> <property name="connection.username">root</property> <property name="connection.password">admin</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <!--映射文件的配置--> <mapping resource="com/demo/pojo/Product.hbm.xml" /> <mapping resource="com/demo/pojo/Category.hbm.xml" /> <mapping resource="com/demo/pojo/User.hbm.xml" /> </session-factory> </hibernate-configuration>View Code
3.6、測試多對多many-to-many關系
package com.demo.test; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.demo.pojo.Product; import com.demo.pojo.User; public class TestHibernate{ public static void main(String[] args){ SessionFactory sf=new Configuration().configure().buildSessionFactory(); Session session=sf.opneSession(); session.beginTransaction(); //增加3個用戶 Set<User> users=new HashSet(); for(int i=0;i<3;i++){ User u=new User(); u.setName("user"+i); users.add(u); s.save(u); } //id=1產品被用戶1,2,3購買 Product product=(Product)session.get(Product.class,1); product.setUsers(users); s.save(product); session.getTransaction().commint(); session.close(); sf.close(); } }View Code
三、持久層框架(Hibernate)