文章標題 Hibernate 1-N 雙相關聯

Hibernate 1-N 雙相關聯
Hibernate 可以通過主控方的實體加載被控方的實體,也可以通過被控方加載主控方的實體
接下來的一個實例將講解1-n與n-1之間的雙向關聯;
1 首先配置hibernate.cfg.xml 文件,該文件放在src目錄下(我用得是Hibernate 4.2.21)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wang</property>
        <property name="hibernate.connection.username">root</property>
        <!--數據庫方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--是否打印數據庫語句到控制檯-->
        <property name="show_sql">true</property>
        <property name="hibernate.show_sql">true</property>
        <!--映射文件路徑-->
        <mapping resource="com/bean2/Factory.hbm.xml" />
        <mapping resource="com/bean2/Product.hbm.xml" />
    </session-factory>
</hibernate-configuration>

接下來是實體bean類
分別是Product.java 和Factory.java

private int id;
    private String name;
    private double price;
    private Factory factory;
    //省略get和set方法以及構造方法
private Integer factoryId;
    private String factoryName;
    private Set<Product> products=new HashSet<Product>();
    //省略get和set方法以及構造方法

其實這中雙向關聯最難得是如何配置xml
Factory.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-12-27 15:20:18 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.bean2.Factory" table="FACTORY">
        <id name="factoryId" type="java.lang.Integer">
            <column name="factoryid" />
            <generator class="native" />
        </id>
        <property name="factoryName" type="java.lang.String" length="45">
            <column name="factoryName" />
        </property>
        <!--lazy=true 延遲加載的策略 Inverser=true 指定由多的一方維持關係-->
        <set name="products" table="PRODUCT" inverse="true" lazy="true">
            <key>
            <!--對應PRODUCT表中的factoryid-->
                <column name="factoryid" />
            </key>
            <one-to-many class="com.bean2.Product" />
        </set>
    </class>
</hibernate-mapping>

Product.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-12-27 15:20:18 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.bean2.Product" table="t_product">
        <id name="id" type="int">
            <column name="id" />
            <!--以Hibernate根據底層數據庫自行判斷採用identity、hilo、sequence
其中一種作爲主鍵生成方式。-->
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" />
        </property>
        <property name="price" type="double">
            <column name="price" />
        </property>
        <!--多對一,多個產品可以由一個工廠生產- name="factory" 需要與對應的bean類相同->
        <many-to-one name="factory" class="com.bean2.Factory">
        <!--數據庫列表名字-->
            <column name="factoryid" />
        </many-to-one>
    </class>
</hibernate-mapping>

加載HIbernateUtil類在此不再詳寫
現在開始手動創建表

public class Test{
   public  void create(){
   Configuration configuration=new Configuration().configure();
    SchemaExport schemaExport=new SchemaExport(configuration);
    schemaExport.create(true, true);//創建表完成
    }
    public void add(){
    //接下來就是給表格添加數據.
    Session session=HibernateUtil.getSession()
    Transaction transaction= session.beginTransaction();
    Product product=new Product();
    product.setName("蘋果");
    product.setPrice(12.5);

    Factory factory=new Factory();
    factory.setName("蘋果加工廠");

    product.setFactory(factory);
    factory.getProducts().add(product);

    session.save(factory);
    session.save(product);
    transaction.commit();
    session.close();
   }
   public void list(){
    //我們已經向表格添加完成數據了
    //接下來則是展示如何查詢
    Session session=HibernateUtil.getSession();
    Transaction transaction= session.beginTransaction();
    //持久化id爲1的對象
    Factory factory=(Factory)session.get(Factory.class,new Integer(1));
       Set<Product> products=factory.getProducts();
    System.out.println(products);//先輸出看看是什麼
    //使用Iterator來迭代set集合 
    Iterator<Product> it=products.iterator();
    while(it.hasNext()){
    //如此就通過Factory查詢到所有擁有該工廠生產的產品,同理可以反過來查詢。
    Product product=it.next();
    System.out.println(product);

   }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章