Hibernate--CirclesOfImage应用

原创 2015年07月06日 19:35:15

本次目的:

需求是为一幅图像寻找里边的所有圆,并将这些圆保存到数据库中。
所以数据库的设计为,对于一幅图像,

  • 保存它的图片名(图片统一保存在某个目录下,所以只需要保存图片名)
  • 保存它里边的所有圆的信息,因为每幅图像中圆个数未知,所以采用List保存所有圆
  • 圆为自定义类型,包括圆心(x,y)以及半径radius

自定义类型Circle

如下图所示,我将Circle存在包c里边。
圆里边有变量x,y记录圆心,radius记录半径,还有一个String变量strCircle记录圆信息,为什么使用它,在接下来会提到。
补充好它们的get和set方法!

这里写图片描述

存储用类型CirclesOfImage

设计的存储类型如下:
int类型的id号
String类型的imageUrl
List<String>类型的circles
这个类保存在hibernate包中。

这里写图片描述

hibernate.cfg.xml

在src里边新建这个文件就好了,在这里设置的具体数据库映射文件为在包hibernate中的Circles.hdb.xml。
这里写图片描述

Circles.hdb.xml

我把它创建在包hibernate里边,主键为id,有一个imageUrl列,以及一个存储List的列,List为另外的一张表,在这里用外键引用。
这里写图片描述

Test.java测试类

    package hibernate;
    import java.util.ArrayList;
    import java.util.List;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import c.Circle;

    public class Test {

        /**
         * @param args
         */
        private SessionFactory sessionFactory;
        private Configuration configuration;
        private ServiceRegistry serviceRegistry;
        private Transaction transaction;
        private Session session;
        public Test(){
            sessionFactory = null;
            configuration = new Configuration().configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
        }
        public void destroy(){
            transaction.commit();
            session.close();
            sessionFactory.close();
        }
        public void test(){                 
            CirclesOfImage circlesOfImage = new CirclesOfImage();
            circlesOfImage.setImageUrl("abc.jpg");
            List<String> circles = new ArrayList<String>();
            for (int i = 0; i < 10; i++){
                Circle c = new Circle(i, i+1, i+2);
                circles.add(c.getStrCircle());
            }
            circlesOfImage.setCircles(circles);
            session.save(circlesOfImage);
        }
        public void get(){
            CirclesOfImage circlesOfImage = (CirclesOfImage)session.get(CirclesOfImage.class, 1);
            System.out.println(circlesOfImage.toString());
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Test t = new Test();
            t.test();
            t.get();
            t.destroy();

        }

    }

这里有三个问题:

  1. 为什么用List<String> 而不是ArrayList<String>来记录circles?
    2.为什么用String记录Circle而不是用直接用Circle类型呢?
  2. 在mysql中List<String>类型该怎么存储呢?

第一个问题

如果我采用了ArrayList<String>的话,也就是写成
ArrayList<String> circles = new ArrayList<String>();
那么会报这个错误:
Expected type: java.util.List, actual value: org.hibernate.collection.internal.PersistentSetup
解决办法我是在[http://blog.csdn.net/hollboy/article/details/9006043]看到的。(http://blog.csdn.net/hollboy/article/details/9006043)
**里边是这样分析:Hibernate为了方便对集合懒加载操作,在顶层对所有的jdk中的集合进行了改写,所以只要以保存之后再取出来,hibernate已经对数据类型进行转换
所以domain定义时属性不能定义成具体的类,而是定义成接口(如定义成Set而不是HashSet), 否则在hibernate中运行会报类型异常。**

第二个问题

如果我写成
ArrayList<Circle> circles = new ArrayList<Circle>();
那么会报这个错哦:
org.hibernate.MappingException: Could not determine type for: c.Circle
我映射文件是这么写的
<list name = "circles" table = "circles">
<key>
<column name = "circle_id"></column>
</key>
<list-index>
<column name="list_order"></column>
</list-index>
<element type = "c.Circle">
<column name="circle_info"></column>
</element>
</list>

似乎映射是写对了,我的类是在c.Circle中,但是呢,type是写给hibernate看的,hibernate有一些支持的类型,也就是它可以识别的,可以用来存储的类别,而其他的自定义类别它肯定是识别不了的嘛,也许有方式,不过我这里就简单地用String来存储Circle不就解决问题了嘛!
关于hibernate中可用的映射类型可以查看
http://www.cnblogs.com/aijava/archive/2008/06/04/2191859.html

第三个问题

我是看
[http://blog.sina.com.cn/s/blog_86f4502c0101fmkp.html]解决的。(http://blog.sina.com.cn/s/blog_86f4502c0101fmkp.html)
按照我上面的方式来做也就可以了,也就是再建张表来存储啦,确实可以存储可变长,很神奇。

实验结果

在数据库中确实多了两个表哦。
这里写图片描述
来分别看一下它们的具体存储
这里写图片描述
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

hash算法的实际运用

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是...
  • u013445530
  • u013445530
  • 2014年12月17日 13:48
  • 2864

腾讯应用宝认领应用步骤

腾讯应用宝认领步骤
  • xinychan
  • xinychan
  • 2016年10月25日 10:35
  • 2955

似然估计和极大似然估计应用

似然估计:        设总体X服从分布P(x;θ),但X是随机变量时为概率密度,当X为离散型随机变量时为概率分布)。θ为待估计函数,X1,X2,X2,...,Xn是来自于总体X的样本,x1,x2...
  • china1000
  • china1000
  • 2013年11月10日 00:58
  • 902

贝叶斯算法的应用

简介 学过概率理论的人都知道条件概率的公式:P(AB)=P(A)P(B|A)=P(B)P(A|B);即事件A和事件B同时发生的概率等于在发生A的条件下B发生的概率乘以A的概率。由条件概率公式推导...
  • u013378306
  • u013378306
  • 2016年08月19日 18:40
  • 8616

关于异或的一些东西和应用

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结...
  • rockpk008
  • rockpk008
  • 2015年11月22日 23:22
  • 1023

Servlet应用

,Servlet的应用 •         Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的web页面。它担当Web浏览器或其他http客户程序发出请求、与http服...
  • liuw1314
  • liuw1314
  • 2011年10月19日 17:54
  • 993

链表的实际应用1

在上次的《链表的基本应用》中,大致的说明了;链表的基本算法和概念,但这也只是书面的介绍而已,而它到底怎么用连我自己也不是很清楚,所以现在在练一些可以用链表来做题的题目,做了几道题,觉得还可以,所以现在...
  • deardeer4869
  • deardeer4869
  • 2015年04月25日 23:44
  • 1208

二叉搜索树的应用

如果给我一个二叉搜索树的数据,一定要从头开始找,另外我还学到了双指针或多个指针记录前面顺序等想法。毕竟没学过ACM,啥都不会,哈哈哈哈#include #include using namespac...
  • liuzhustu
  • liuzhustu
  • 2016年11月18日 14:28
  • 1012

最小生成树 Prim算法的实现及应用

关于prim算法先把有的点放于一个集合(或者数组)里,这个集合里存放的是所有走过的点。初始值为0或者false表示还没有点声明一个一维数组用于记录各点的权值[可理解为起始点到目标点的距离],声明一个二...
  • jiahui524
  • jiahui524
  • 2011年07月29日 09:53
  • 6447

高斯消元法的应用

//执行环境是VC 6.0//通过高斯消元法求解方程的解//input://           2 5 8//           9 2 12//output://    x1:1.073171/...
  • hongweijin
  • hongweijin
  • 2004年11月09日 16:54
  • 2002
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate--CirclesOfImage应用
举报原因:
原因补充:

(最多只允许输入30个字)