• hibernate对象映射关系一定要有吗?


    下面内容仅为自己理解,仅供参考

    对象关系映射主要作用

    1、将查询结果自动封装为对象

    2、将对像持久化到数据库时字段映射。

    如何映射?

    @Entity
    @Table(name = "cin_clientupdate_new", catalog = "urapport_config")
    public class ClientVersion {
        private Long id;
        private String clienttype;
        private String clientversion;
        private String updatetype;
    @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", unique = true, nullable = false)
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
    }

    如果使用注解,示例如上(省略部分属性、方法),必须要有@Entity @Table @Id 注解,其它字段可不要注解,映射时会自动将对象的属性名和数据库的字段名对应。如果名称不一致就必须写明。

    使用示例

    1、使用原生sql,对象有映射关系时示例如下,会对结果进行自动映射

    public List<T> sqlQuery(final String sql, final Class clazz, final Object... values) {
            return (List) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws SQLException {
                    List list = null;
                    try {
                        SQLQuery query = session.createSQLQuery(sql);
                        query.addEntity(clazz);//添加实体类,后面会对结果进行映射
                        if (values != null && values.length > 0) {
                            for (int i = 0; i < values.length; i++) {
                                query.setParameter(i, values[i]);
                            }
                        }
                        list = query.list();
                    } finally {
                        releaseSession(session);
                    }
                    return list;
                }
            });
        }

    2、使用原生sql查询,对象映射关系时示例如下,需要自己对结果进行封装

    public <T> List<T> sqlQueryPOJO(final String sql, final Class sclass, final Object... objs) {
            return (List<T>) this.getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws SQLException {
                    List list;
                    List l;
                    try {
                        if (sclass == null) {
                            throw new Exception("Class sclass is null!!!");
                        }
                        SQLQuery query = session.createSQLQuery(sql);
                        query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);//将结果转为Map对象
                        for (int i = 0; i < objs.length; i++) {
                            query.setParameter(i, objs[i]);
                        }
                        list = query.list();
                        l = getDataFromMap(list, sclass);//将Map转为对象
                    } catch (Exception e) {
                        e.printStackTrace();
                        return null;
                    } finally {
                        releaseSession(session);
                    }
    
                    return l;
                }
            });
        }
    private List getDataFromMap(List<Map<String, Object>> list, Class sclass) throws InstantiationException,
                IllegalAccessException, ClassNotFoundException, InvocationTargetException, NoSuchFieldException {
            List l = new ArrayList();
            if (list != null && list.size() > 0) {
    
                Field[] fs = sclass.getDeclaredFields();
                for (Map<String, Object> map : list) {
                    Object obj = Class.forName(sclass.getName()).newInstance();
                    for (Field f : fs) {
                        String n = f.getName();
                        if ("serialVersionUID".equals(n)) {
                            continue;
                        }
                        Object v = map.get(n);
                        if (v != null) {
                            if ("java.sql.Timestamp".equals(v.getClass().getName())
                                    && "java.util.Date".equals(f.getType().getName())) {
                                java.sql.Timestamp t = (java.sql.Timestamp) v;
                                Calendar c = Calendar.getInstance();
                                c.setTimeInMillis(t.getTime());
                                v = c.getTime();
                            }
                            BeanUtils.setProperty(obj, n, v);
                        } else {
                            Column column = f.getAnnotation(Column.class);
                            String str = n;
                            if (column == null) {
                                str = str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
                                try {
                                    column = sclass.getMethod("get" + str).getAnnotation(Column.class);
                                } catch (NoSuchMethodException e) {
                                    ;
                                }
                            }
                            if (column == null) {
                                continue;
                            }
                            str = column.name();
                            v = map.get(str);
                            if (v != null) {
                                BeanUtils.setProperty(obj, n, v);
                            }
                        }
                    }
                    l.add(obj);
                }
            }
            return l;
        }

    总结:对象关系映射不一定要有,主要看项目中怎么使用(上面代码仅为示例)

  • 相关阅读:
    SQLServer中Case的用法
    SqlServer Convert 函数应用
    探讨SQL Server中Case 的不同用法
    SWF文字查询及高亮显示——第二步:实现文字查询高亮显示基本思路篇
    SWF文字查询及高亮显示——第三步:实现文字查询高亮显示及解决MovieClip帧切换时关键字无法高亮显示的问题
    我平时整理的一个生成机器码的类(转载)
    SWFTools (pdf2swf) to properly work with Flex (精彩转载)
    让Flash的swf文件在客户端不缓存(IIS配置)(强烈推荐)
    开始整SWF文字高亮显示——第一步:解析PDFToFlex源文件(修改补充版)
    解决PDFToFlex源程序的小BUG——页面控制的最后两页无法正常切换问题
  • 原文地址:https://www.cnblogs.com/xyfaneast/p/11384393.html
Copyright © 2020-2023  润新知