hibernate多对一和一对多关联
關聯,是類的實例之間的關系,表示有意義和值得關注的連接。
?
多對一單向關聯:
單向多對一:<many-to-one>定義一個持久化類與另一個持久化類的關聯這種關聯是數據表間的多對一關聯,需要此持久化類映射表的外鍵引用另一個持久化類映射表的主鍵
many-to-one的一些屬性:
update:進行update操作時是否包含此字段?
insert:進行insert操作時是否包含此字段?
update="false"?insert="false"?意味著這格ClientChildType??無論何種情況,都不會被Hibernate?更新,新增,只有刪除的時候,會影響到??ClientChildType,默認是true
name:映射類屬性的名字?
column:關聯的字段?
class:關聯類的名字?
cascade:設置操作中的級聯策略?可選值為?all所有操作情況均進行級聯、none所有操作情況均不進行級聯、save-update執行save和update操作時級聯、delete執行刪除操作時級聯?
fetch:設置抓取數據的策略?默認值為select序列選擇抓取?可選值為join外連接抓取?
property-ref:指定關聯類的一個屬性,這個屬性將會和本類的外鍵相對應(當外鍵參照一鍵時需要指定改屬性)
雙向多對一:hibernate既可以通過主控方實體加載被控方實體同時也可以通過被控方實體加載主控方實體。也就是說在單向一對多基礎上,在被控方配置與主控方對應的對多一關系
在主鍵為對方外鍵表的持久化類中多了一個控方的Set集合
想要在hashset中進行排序的話,只需要在set標簽內添加屬性order by并賦值即可:
?
?
?
?
?
有關sql:
product表與factory表:
create table Product( id int primary key auto_increment, name varchar(200) not null, price double null, factory int , FOREIGN KEY(factory) REFERENCES factory(factoryid) )create table factory( factoryid int primary key auto_increment, factoryname varchar(200) not null )Factory.java和Product.java與它們的hmb.xml
package com.hibernate.bean;public class Factory {private int factoryid;private String factoryname;public int getFactoryid() {return factoryid;}public void setFactoryid(int factoryid) {this.factoryid = factoryid;}public String getFactoryname() {return factoryname;}public void setFactoryname(String factoryname) {this.factoryname = factoryname;}public Factory(int factoryid, String factoryname) {super();this.factoryid = factoryid;this.factoryname = factoryname;}public Factory(){}} <class table="FACTORY" name="com.hibernate.bean.Factory" ><id name="factoryid" type="int"><column name="FACTORYID"></column><generator class="identity"></generator></id><property name="factoryname" type="string"><column name="FACTORYNAME"/></property></class> package com.hibernate.bean;public class Product {private int id;private String name;private double price;private Factory factory;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 double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Factory getFactory() {return factory;}public void setFactory(Factory factory) {this.factory = factory;}public Product(){}public Product(int id, String name, double price, Factory factory) {super();this.id = id;this.name = name;this.price = price;this.factory = factory;}} <class table="PRODUCT" name="com.hibernate.bean.Product" ><id name="id" type="int"><column name="ID"></column><generator class="identity"></generator></id><property name="name" type="string"><column name="NAME"/></property><property name="price" type="double"><column name="PRICE"/></property><!--<property name="factory" type="int"><column name="FACTORY"/></property>--><many-to-one name="factory" class="com.hibernate.bean.Factory"><column name="FACTORY"/> </many-to-one></class>測試:
public static void main(String[] args){Session session=HibernateUtil.getSessionFactory().openSession();session.beginTransaction();Product p=(Product)session.get(Product.class, 1);System.out.println("產品名稱:"+p.getName()+"\t"+"產品價格:"+p.getPrice()+"\t"+"生產商:"+p.getFactory().getFactoryname());}結果:
注意:
在Product.java中的Factory不是數據表中的Factory字段,是一個Factory類對象。
<many-to-one> name屬性填寫持久化類中的字段名,class屬性填寫從表對應的持久化類名,相當于<property>中的type屬性,<column>中name填寫數據表中的對應字段也就是外鍵的字段
one-to-many:
就是前面的雙向配置多對一的與單向的區別部分:
demo:
?
factory類增加Set的products屬性以及其gettersetter方法private Set<Product> products;public void setProducts(Set<Product> products) {this.products = products;}public Set<Product> getProducts() {return products;} ......?
<set name="products" inverse="true"> <!--inserse=true意思是改變 該類的該set集合放棄對關聯關系的維護權, 改變set中的內容,在factory類中的update和insert操作不影響數據庫,個人表示這是正確的,因為在附表中的set集合本來就是虛構的一個字段,所以里面元素的改變不應該影響數據庫中的改變--> <key column="FACTORY"/><!--注意:column的值是主表的外鍵名而不是映射文件對應表的主鍵名--> <one-to-many class="com.hibernate.bean.Product"/></set> public static void main(String[] args){Session session=HibernateUtil.getSessionFactory().openSession();Transaction tx=session.beginTransaction();Factory f=(Factory)session.get(Factory.class, 1);System.out.println("編號:"+f.getFactoryid()+"\t名稱:"+f.getFactoryname());Set<Product> s=f.getProducts();Iterator<Product> it=s.iterator();System.out.println("該工廠生產的商品:");while(it.hasNext()){Product p=it.next();System.out.println(p.getName()+"\t"+p.getPrice()+"元");}tx.commit();}結果:
?
總結
以上是生活随笔為你收集整理的hibernate多对一和一对多关联的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel 5.1 添加第三方扩展库
- 下一篇: 采用Angular勾画SVG圆环形进度条