hibernate 视图映射

来源:互联网 发布:手机移动网络自动打开 编辑:程序博客网 时间:2024/06/08 10:28

Hibernate操作视图

首先我们要知道,对于视图其实就是存储了一条sql语句,对多个表进行关联查询后得到一个视图,对于关联较多的表可以很方便,hibernate可以使用两种操作方法

一,在数据库中建立视图,然后可以把视图当做普通的表一样进行映射操作

需要注意的是,可以使用rownum 来做视图的主键,主要就不需要使用主键类来设置

CREATE OR REPLACE VIEW V_SHGW_SAFESTOCK AS
SELECT rownum id,pro.productid,pro.productname 。。。。FROM   。。。。

 

 

映射文件

<hibernate-mapping>

    <class name="com.dg11185.shgw.pojo.warehouse.VShgwSafestock" table="V_SHGW_SAFESTOCK" schema="SHGW">

        <id name="id" type="java.lang.Long">

            <column name="ID" precision="0" />

            <generator class="native" />

        </id>

        <property name="productid" type="java.lang.Long">

            <column name="PRODUCTID" precision="10" scale="0" />

        </property>

        <property name="productname" type="java.lang.String">

            <column name="PRODUCTNAME" />

        </property>

         ....

    </class>

</hibernate-mapping>

 

二,在数据库中建立视图,然后可以把视图当做普通的表一样进行映射操作

/**

 * 销售单据视图的ID类

 * 

 * @author 黄文韬

 * @since 1.0

 * @Copyright 2013 东莞市邮政局All rights reserved.

 */ 

public class ExchangegoodsViewId implements Serializable{

private Long id;

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

}

 

//视图类

public class ExchangegoodsView implements java.io.Serializable {

private ExchangegoodsViewId exchangeViewId;

private Long orderid;

private String username;

private String telephone;

private String invoicenum;

private Double spreadprice;

//字段和setter/getter方法省略

}

 

一, 

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- 

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="com.dg11185.shgw.pojo.sales.ExchangegoodsView" table="EXCHANGEGOODS_VIEW" schema="SHGW">

            <!-- 由于视图没有主键,需要挑选出一个不为空的唯一标志字段,为视图主键,这里选用主表的主键作为视图的逐渐字段 -->

        <composite-id class="com.dg11185.shgw.pojo.sales.ExchangegoodsViewId" name="exchangeViewId"> //name是视图Id类在视图类中的属性名字

            <key-property name="id" type="java.lang.Long">//name是视图Id类中id的属性名字

                <column name="EXCHANGEID" precision="10" scale="0" />

            </key-property>

        </composite-id>

            <property name="orderid" type="java.lang.Long">

                <column name="ORDERID" precision="15" scale="0" />

            </property>

            <property name="username" type="java.lang.String">

                <column name="USERNAME" length="20" />

            </property>

            <property name="telephone" type="java.lang.String">

                <column name="TELEPHONE" length="20" />

            </property>

            <property name="invoicenum" type="java.lang.String">

                <column name="INVOICENUM" length="20" />

            </property>

        。。、、、属性省略

            </property>

    </class>

</hibernate-mapping>

 

 

 

实体类就是普通的实体类!

注意:在视图中,oracle要求自定义的列名要大写

create or replace view productview as
select pdt.productid,pdt.name as "PRODUCTNAME",pdt.amount,pdt.price,pdt.year,pdt.avggrade, cls.classid,cls.parentid, cls.name as "CLASSNAME", img.url,pdt.storeid,st.name as "STORENAME"
from tb_zhjy_product pdt left join Tb_Zhjy_Product_Class pcs on pcs.productid = pdt.productid
join tb_zhjy_class cls on pcs.classid = cls.classid
left join tb_zhjy_images img on pdt.productid = img.relatedid
left join tb_zhjy_store st on st.storeid = pdt.storeid
where img.sequence=1 and img.usage=0 and
pdt.status = 1 and pdt.banstatus = 0

 

 

三,Hibernate操作视图,此视图是把sql语句放在hibernate的配置文件中:

 

1, 首先确定一下通过视图要得到的字段信息,建立一个普通的bean

package com.hwt.view;

 

public class EmpDep implements java.io.Serializable {

 

private String asid;

private String called;

private String declaration;

 

   ...

(生成setter  getter方法)

}

 

 

2,建立一个配置文件 对应着上面的类名:EmpDep.hbm.xml 

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

<! name里面对应着一个普通的bean类,entity-name是视图的名字  -->

<class name="com.hwt.view.EmpDep " entity-name="EmpDep">

<!-- 建立视图的sql语句 -->

 <subselect>

<!--此处写sql语句-->

                 Select empId,empName,depName from emp,dep where emp.depId = dep.depId;

  </subselect>

<!--注意顺序,这里是说下面的表数据变后查询视图的数据也变 -->

<synchronize table="TB_Emp "/> 

<synchronize table="TB_Dep"/> 

 

<!-- 对应上面sql查出来的属性 -->

<composite-id>

<key-property name="empId" column="EMPID" type="string" />

</composite-id>

<property name="empName" column="EMPNAME" type="string" />

<property name="depId" column="DEPID" type="string" />

</class>

</hibernate-mapping>

 

原创粉丝点击