当前位置: 首页 > news >正文

Hibernate对视图的映射

        在使用hibernate映射数据表,如果设置太多的映射关系,many-to-one,one-to-many,one-to-one的话则hibernate生成的hql语句太多,造成太多的数据冗余,效率太低,而且太多的字段都用不到,所以可以通过创建数据库视图的方式,hibernate中通过对视图的映射,读取自己所需要的字段信息来进行信息的查询, hibernate中使用视图与普通表不太一样,因为视图没有主键,所以不能通过myEclips 的反映射视图功能对视图表进行操作, 但是可以通过自己创建hibernate的实体类与xml的映射文件来配置视图表,在设置xml映射文件时,可以通过视图表中的某个唯一字段或者identity字段来虚拟表中的主键,也就是设置xml中的id类型为identity (identity为数据库自动生成标识列,如果为其他的方式获取到主键编号,则可以设置为其他的字段类型):

        在做视图映射的时候,配置文件中设置的主键编号一定不能在视图表内出现重复,否则会出现查询返回的数据条数正确,但是数据却全部都是重复的,因为主键是不能重复的,配置文件只会查找主键不一致的记录,  所以推荐假设主键为其中一个最终子表的ID,那么视图表中这个字段也就不存在重复的数据了。Hibernate若是查询只需几个字段的数据,则可以重新定义一个新的实体类+映射表+DAO类来进行创建。


假设有个视图,内有字段: 

private Integer memId;  用户的编号

    private Integer regId;   用户是密码的保护设置对应的id

    private String memName;  用户的登陆名

    private String memNickName; 用户的昵称

    private Integer memSex;     用户的性别

    private Byte memStatus;    用户的状态

 

    其中,memId 为用户信息表的主键id, regId 为用户密码保护问题表的id,regId所在的表有外键对应用户信息表的主键memId.

    则在xml中的设置为:


<class name="com.myBlog.po.ViewSessionInfo" table="ViewSessionInfo" schema="dbo" catalog="BlogDB">

<id name="memId" type="java.lang.Integer">    可以假设个主键,使用视图表中的memId字段

           <column name="mem_ID" />             视图表中的字段名

           <generator class="identity"/>        设置memId字段生成策略

       </id>                  其他字段的设置就和普通的表的字段设置是相同的

       <property name="regId" type="java.lang.Integer">

           <column name="reg_ID" />

       </property>

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

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

       </property>

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

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

            </property>

            <property name="memSex" type="java.lang.Integer">

                <column name="mem_Sex" />

            </property>

            <property name="memStatus" type="java.lang.Byte">

                <column name="mem_Status" />

            </property>

</class>

*******************************************************

ViewSessionInfo 实体类设置如下:

 

public class ViewSessionInfo implements java.io.Serializable { private Integer memId;

    private Integer regId;

    private String memName;

    private String memNickName;

    private Integer memSex;

    private Byte memStatus;

    public ViewSessionInfo() {

    }

    public ViewSessionInfo(Integer memId, String memName, String memNickName) {

       this.memId = memId;

       this.memName = memName;

       this.memNickName = memNickName;

    }

    public ViewSessionInfo(Integer memId, Integer regId, String memName,

           String memNickName, Integer memSex, Byte memStatus) {

       this.memId = memId;

       this.regId = regId;

       this.memName = memName;

       this.memNickName = memNickName;

       this.memSex = memSex;

       this.memStatus = memStatus;

    }

    public Integer getMemId() {

       return this.memId;

    }

    public void setMemId(Integer memId) {

       this.memId = memId;

    }

    public Integer getRegId() {

       return this.regId;

    }

    public void setRegId(Integer regId) {

       this.regId = regId;

    }

    public String getMemName() {

       return this.memName;

    }

    public void setMemName(String memName) {

       this.memName = memName;

    }

    public String getMemNickName() {

       return this.memNickName;

    }

    public void setMemNickName(String memNickName) {

       this.memNickName = memNickName;

    }

    public Integer getMemSex() {

       return this.memSex;

    }

    public void setMemSex(Integer memSex) {

       this.memSex = memSex;

    }

    public Byte getMemStatus() {

       return this.memStatus;

    }

    public void setMemStatus(Byte memStatus) {

       this.memStatus = memStatus;

    }}

 

**************************************************

ViewSessionInfo 实体类对应的 ViewSessionInfoDAO 设置如下:

 

public class ViewSessionInfoDAO extends BaseHibernateDAO {

    private static final Log log = LogFactory.getLog(ViewSessionInfoDAO.class);

 

***  根据用户的memID来查找  ViewSessionInfo 视图表的信息 就和普通表通过主键id进行查找数据的方法是一样的**********

    public  ViewSessionInfo findById(java.lang.Integer id) {

       log.debug("getting BlogComment instance with id: " + id);

       try {

            ViewSessionInfo instance = (ViewSessionInfo) getSession().get("com.myBlog.po.ViewSessionInfo", id);

           return instance;

       } catch (RuntimeException re) {

           log.error("get failed", re);

           throw re;

       }

    }

 }//则调用findById就可以根据传输进来的id查找到所需要的视图数据了

 

SessionFactory代码:::::::::::::::::::::::::::::::::

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

 

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

    private static final ThreadLocal threadLocal = new ThreadLocal();

    private  static Configuration cfg = new Configuration();

    private static org.hibernate.SessionFactory sessionFactory;

    private static String configFile = CONFIG_FILE_LOCATION;

 

    private HibernateSessionFactory() {

    }

    public static Session getSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

       if (session == null||!session.isOpen()) {

           if (sessionFactory == null) {

              try{

                  cfg.configure(configFile);

                  sessionFactory=cfg.buildSessionFactory();

              }catch(Exception e)

              {

                  System.err.println("%%%%Error Creating SessionFactory%%%%");

                  e.getStackTrace();

              }

           }

           session =sessionFactory.openSession();

           threadLocal.set(session);

       }

        return session;

    }

    public static void closeSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

        threadLocal.set(null);

        if (session != null&& session.isOpen()) {

            session.close();

        }

    }



转载自:http://chengwei2009.blog.163.com/blog/static/228683282009218102718455/



相关文章:

  • Hibernate的generator属性
  • ognl.ExpressionSyntaxException: Malformed OGNL expression
  • jquery-1.11.1.min.js与jquery.min.js有红色的叉号
  • 火狐中的firebug学习
  • jQuery EasyUI中的datagrid无法显示json数据
  • java中session对象及其常用方法
  • 从Hibernate中获得JDBC连接
  • iOS学习之UIActionSheet的使用
  • Android HOME键那些事
  • 在非activity的类中调用startActivity(intent)
  • iOS中#import和@class的区别
  • Android开机自动启动程序设置 .
  • varchar与nvarchar的区别
  • Android中的资源文件
  • Java中的==和equals区别
  • ES6指北【2】—— 箭头函数
  • 《Java编程思想》读书笔记-对象导论
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • android图片蒙层
  • angular2开源库收集
  • CentOS 7 防火墙操作
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • httpie使用详解
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • leetcode98. Validate Binary Search Tree
  • 百度地图API标注+时间轴组件
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 机器学习学习笔记一
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 讲清楚之javascript作用域
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何设计一个比特币钱包服务
  • 数组大概知多少
  • 突破自己的技术思维
  • 移动端唤起键盘时取消position:fixed定位
  • 自定义函数
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (转)jQuery 基础
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET Core WebAPI中封装Swagger配置
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • @RequestMapping处理请求异常
  • @Service注解让spring找到你的Service bean
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798