hibernate多对一和一对多关联
關(guān)聯(lián),是類的實例之間的關(guān)系,表示有意義和值得關(guān)注的連接。
?
多對一單向關(guān)聯(lián):
單向多對一:<many-to-one>定義一個持久化類與另一個持久化類的關(guān)聯(lián)這種關(guān)聯(lián)是數(shù)據(jù)表間的多對一關(guān)聯(lián),需要此持久化類映射表的外鍵引用另一個持久化類映射表的主鍵
many-to-one的一些屬性:
update:進(jìn)行update操作時是否包含此字段?
insert:進(jìn)行insert操作時是否包含此字段?
update="false"?insert="false"?意味著這格ClientChildType??無論何種情況,都不會被Hibernate?更新,新增,只有刪除的時候,會影響到??ClientChildType,默認(rèn)是true
name:映射類屬性的名字?
column:關(guān)聯(lián)的字段?
class:關(guān)聯(lián)類的名字?
cascade:設(shè)置操作中的級聯(lián)策略?可選值為?all所有操作情況均進(jìn)行級聯(lián)、none所有操作情況均不進(jìn)行級聯(lián)、save-update執(zhí)行save和update操作時級聯(lián)、delete執(zhí)行刪除操作時級聯(lián)?
fetch:設(shè)置抓取數(shù)據(jù)的策略?默認(rèn)值為select序列選擇抓取?可選值為join外連接抓取?
property-ref:指定關(guān)聯(lián)類的一個屬性,這個屬性將會和本類的外鍵相對應(yīng)(當(dāng)外鍵參照一鍵時需要指定改屬性)
雙向多對一:hibernate既可以通過主控方實體加載被控方實體同時也可以通過被控方實體加載主控方實體。也就是說在單向一對多基礎(chǔ)上,在被控方配置與主控方對應(yīng)的對多一關(guān)系
在主鍵為對方外鍵表的持久化類中多了一個控方的Set集合
想要在hashset中進(jìn)行排序的話,只需要在set標(biāo)簽內(nèi)添加屬性order by并賦值即可:
?
?
?
?
?
有關(guān)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("產(chǎn)品名稱:"+p.getName()+"\t"+"產(chǎn)品價格:"+p.getPrice()+"\t"+"生產(chǎn)商:"+p.getFactory().getFactoryname());}結(jié)果:
注意:
在Product.java中的Factory不是數(shù)據(jù)表中的Factory字段,是一個Factory類對象。
<many-to-one> name屬性填寫持久化類中的字段名,class屬性填寫從表對應(yīng)的持久化類名,相當(dāng)于<property>中的type屬性,<column>中name填寫數(shù)據(jù)表中的對應(yīng)字段也就是外鍵的字段
one-to-many:
就是前面的雙向配置多對一的與單向的區(qū)別部分:
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集合放棄對關(guān)聯(lián)關(guān)系的維護(hù)權(quán), 改變set中的內(nèi)容,在factory類中的update和insert操作不影響數(shù)據(jù)庫,個人表示這是正確的,因為在附表中的set集合本來就是虛構(gòu)的一個字段,所以里面元素的改變不應(yīng)該影響數(shù)據(jù)庫中的改變--> <key column="FACTORY"/><!--注意:column的值是主表的外鍵名而不是映射文件對應(yīng)表的主鍵名--> <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("該工廠生產(chǎn)的商品:");while(it.hasNext()){Product p=it.next();System.out.println(p.getName()+"\t"+p.getPrice()+"元");}tx.commit();}結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的hibernate多对一和一对多关联的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel 5.1 添加第三方扩展库
- 下一篇: 采用Angular勾画SVG圆环形进度条