龙님의 프로필龙啸居사진블로그리스트 도구 도움말

肖 龙

사진(1/4)
추가한 리스트 항목이 없습니다.
8월 17일

一个让人吐血的错误

进行代码调试时出现一个错误:
net.sf.hibernate.MappingException: No persister for: com.lianchuang.s
martsecurer.mysql.ocs.HardWare
从字面上看好像是HardWare这个类不能持久化,检查这个类,看是否有POJO类和映射文件中字段类型不匹配的问题
没有发现这类错误,到是找到几个漏掉的字段,兴奋的以为发现了错误
运行后,错误依旧,再仔细检查,运行,错误还在,如此反复竟然消耗掉了一个中午的时间,实在没有办法了
打开google,搜索“net.sf.hibernate.MappingException: No persister for”,打开结果中的第一条
这厮的错误描述跟我一模一样,赶快看人家的回复,看完第一条感觉天璇地转,他是这样说的:
  1. Frank Merenda Says:
    July 25th, 2004 at 3:10 pm

    oh man, believe it or not, I just had the same problem. I found your post, and realized that I also forgot to add my new .hbm.xml file to my application.

    Thanks!
    -Frank Merenda

下面一大堆回复,竟然很多人犯了和我一样的错误。

8월 14일

中国特色的计算机理论专家

前几天培训课上,某培训老师对我们说,他老板认识一位镇江传媒大学的教授,现年35岁,计算机理论专家
 
国内外发表论文250篇,我敢肯定在中国很多的叫兽发表的论文绝对在他之下,当然他论文的质量另当别论
 
可是这样一个牛比的计算机理论家竟然连电脑开机都不会,有点夸张。
 
到底要赞叹这样的教授很牛比,还是为搞计算机研究的工作者悲哀呢,我不知道
 
到是我曾经听说过中国古代有位老兄纸上谈兵的功夫甚是了得
 
我突然想起来了,中国的教授为什么在计算机没有发明以前大家都不去搞计算机理论研究呢?
 
而等计算机已经发展到如日中天的时候就有不会开机的计算机理论研究者呢?
 
要么他是冯.诺伊曼转世,要么他就是一个传说中的火星人。
 
传说这个教授现在在大名鼎鼎的宇宙最高学府江南大学,希望有立志为计算机理论献身的仁人志士选他做导师。
7월 26일

以此献给中国足球队

一定要学最凶悍的打法

请德国人当顾问

要建就建最高档次的比赛场地

球场直接跟国际接轨

国脚都要很有名的

什么李毅呀,郑智呀,李伟峰呀

能给它上的都给它上

年薪至少二百万,国家每年还有奖金

教练全用中国本土的

党员,很会装B的那种

比赛一打完,甭管有事儿没事儿都跟人家说

操你妈个比,裁判真黑

一口地道的普通话

倍儿有面子

球队训练场就建在红灯区旁边,小姐还是国外的

一年洗头就要花个几万美金

里面还有一个泰国式按摩房,二十四小时营业

就是一个字儿——爽

就是中场休息也要进去花个万儿八千的

周围的队友不是打架啊,就是场上扇别人耳光

你要是就吐了一下口水

你都不好意思跟队友打招呼

你说这样的球队,一年得废多少个人

我觉得怎么着也的二三个吧

二三个?那是打友谊赛

五六个起

你别嫌多,还不包括受伤的

你得研究中国球员的心理

能够一脚把别人踢残的

根本不在乎再多废几个

什么叫牛X球员你知道吗

X球员就是

踢球的时候不管脚法,只管废人

所以,我们球员的口号是

不求最好,但求最狠

尤文图斯你就从了吧!!

闻意甲“电话门事件”二审结果,果然和传言相符,传言说意大利举起第18届大力神杯,可能大赦天下,对“电话门事件”从轻处罚。

足球越来越让人感觉很无奈,可能给人感觉太多的人为操作痕迹吧。尤文只恨自己没有生在中超啊,那可是中国的超级假球联赛(简称超假),你要是没打假球,你都不好意思跟人家打招呼。

做JUnit测试的时候发生的低级错误

Eclipse里做JUnit测试的时候一定要记得把test目录设为java src 目录,嘿嘿,否则就会报下面的错误

 

 “Test type does not exist”

使用Jdom解析XML文件

其实对于XML文件的读取解析等工作,我一直都没有仔细的看过。这也成了我的硬伤,说不懂自己不服气,写程序肯定难不到我,其实只是知其然而不知其所以然而已(归根结底还是没有好好的静下心来看过)。

   说到解析XML文件自然会使用Jdom,那可是行业标准。首先从代码入手看看整个解析XML文件的过程。

   下面有一个写好的XML文件如下:

 

<LinkageDesktopSecurity>

<PolicyList>

   <Policy>

      ……

</Policy>

<Policy>

      ……

</Policy>

<Policy>

      ……

</Policy>

<Policy>

      ……

</Policy>

</PolicyList>

</LinkageDesktopSecurity>

(省略号的部分你们随便加些什么节点吧,我比较懒所以就以省略号代替了)

假如我们知道这个文件在c:\test.xml

          Document doc ;

SAXBuilder builder = new SAXBuilder();

        try {
            doc = builder.build(new File(policyString));
        } catch (Exception ex) {
            ex.printStackTrace();
        }

这段代码就没什么好解释的了,就是根据传入的路径以二进制读取XML文件,关键看loadXML这个方法:

public static Document loadXML(InputStream fis) {

    SAXBuilder builder = new SAXBuilder();

    Document doc = null;

    try {

      doc = builder.build(fis);

    }

    catch (JDOMException dome) {

      log.error(dome);

    }

    catch (NullPointerException npe) {

      log.error(npe);

    }

    catch(IOException ioe) {

      log.error(ioe);

    }

    return doc;

  }

这个方法就是把读入的二进制文件build成有意义的DOM树,并返回一个JdomDocument对象,只要有这个对象要取xml里的节点就如探囊取物了。

String spath = "/LinkageDesktopSecurity/PolicyList/Policy";

              XPath xpath = XPath.newInstance(spath);

              List nodePolicys = xpath.selectNodes(doc);

初看这段代码有点懵,XPath是哪路神仙啊?经打听

XPathXML上的一个数据绑定工具,对于这个数据绑定,我的理解是这样的,比如我们有很多XML文件需要解析,有成千上百个XML文件,现在我需要知道某一个给定条件的XML文件,如果把它们放在目录下一个一个的去读,这也是一种方法,但是最消耗时间了,所以就有XPath这个工具,它把这些XML文件用特定的标签记住,如果你需要其中某一个XML文件是,只要给出条件,他就返回一个XML文件给你,速度自然是很快的,其实有点类似于数据库的索引,这就是数据绑定。

spath名曰表达式,你给个特定的表达式,XPath根据表达式返回一个XPath对象,这个对象包含的是XML文件组成的List对象,所以用xpath.selectNodes(doc)就从doc里选出一个符合表达式的XML文件的集合。

for(Iterator iter = nodePolicys.iterator();iter.hasNext();) {

               org.jdom.Element nodePolicy = (org.jdom.Element)iter.next();

}

其实返回的List对象就是jdom里的element对象集合。经过循环得到Element对象,解析特定的XML文件也就很容易了。

Jdom里的element对象我们可以使用getAttributeValue”attributeName”)根据属性名得到属性的值。getChild"attributeName”)这个方法得到一个子XML树,getChildren()这个方法返回多个子树的集合List

   这里说的是我们常用的方法,还有很多方法在这里我就不一一说明了。使用的时候查查手册就很清楚了。

下面我们来看看如何将一个对象转换成XML文件(由于生成xml相对比较简单,粗略说一下)

private String getBaseXML() {

        return "<FilePolicy></FilePolicy>";

}

//先只要生成一个xml文件的根节点,以后的自节点在后面慢慢加

private Document getDocument() throws Exception {

        ByteArrayInputStream bais = new ByteArrayInputStream(getBaseXML().getBytes());

        SAXBuilder builder = new SAXBuilder();

        Document doc;

        try {

            doc = builder.build(bais);

        } catch (Exception ex) {

            throw ex;

        }

        return doc;

    }

根据根节点返回一个Document对象,

Document doc = getDocument();

        Element root = doc.getRootElement();

        root.setAttribute("agentID",policy.getAgentID());

        root.setAttribute("version",policy.getVersion()+"");

        Element audit = new Element("Audit");

        audit.setAttribute("enabled",policy.isAudit()+"");

……

   root.addContent(audit);

 

最后生成XML文件或者返回一个XML文件的字符串

 

ByteArrayOutputStream baos = new ByteArrayOutputStream();

        try {

            XMLOutputter outputter =

            new XMLOutputter("  ", true, "GB2312");

            outputter.setExpandEmptyElements(true);

            outputter.output(doc, baos);

        } catch (java.io.IOException e) {

            throw e;

        }

 

        String result = baos.toString();

至此XML文件的解析和生成有一个全面的了解了。

 

7월 25일

Hibernate中数据库表的继承关系

继承这个词多半用在OOP编程里,比如类的继承,但是在Hibernate里表也有继承关系,这也难怪,因为Hibernate的目的就是要把数据库对象化。

   先来看一个简单的例子,一个人员表Person,这张表里主要纪录一些公司人员的基本信息;还有一张用户表User,这张表纪录的是公司里的人员登陆公司网站的用户名信息表;很显然用户来源于人员,一个人员可以有多个用户,而一个用户只对应一个人员,这样User这张表就可以继承Person这张表了,因为它完全符合继承关系的条件,即User是在Person的基础上扩展而来的。

   下面我们看看上例Hibernate里的HBM XML文件和POJO类是怎么写的,先看HBM XML文件的写法:

<class name="org.user.dao.hibernate.Person" table="person">

 

    <id name="id" column="id"><generator class="increment" /></id>

 

    <property name="firstName" column="firstname" length="30"/>

    <property name="lastName"  column="lastname" length="30"/>

   

    <joined-subclass name="org.user.dao.hibernate.User" table="user">

      <key column="person_id"/>

      <property name="id" column="id"/>   

      <property name="userName" column="user_name"/>

    </joined-subclass>

  </class>

这个XML文件体现了PersonUser的继承关系,如果你还是不太清楚地话,看下面的POJO类,那可是百分之百的继承关系了:

package org.user.dao.hibernate;

 

import java.io.Serializable;

 

 

public class Person implements Serializable {

 

    private static final long serialVersionUID = 6254796603241870646L;

 

    private long id;

 

    private String firstName;

 

    private String lastName;

 

    public Person() {

    }

 

    public String getFirstName() {

        return this.firstName;

    }

 

    public void setFirstName(String firstName) {

        this.firstName = firstName;

    }

 

    public String getLastName() {

        return this.lastName;

    }

 

    public void setLastName(String lastName) {

        this.lastName = lastName;

    }

 

    public long getId() {

        return id;

    }

 

    public void setId(long id) {

        this.id = id;

    }

}

User类的写法:

package org.user.dao.hibernate;

 

public class User extends Person {

 

       private static final long serialVersionUID = 2848034506633654174L;

 

 

       private String userName;

 

       public User() {

       }

 

       public String getUserName() {

              return this.userName;

       }

 

       public void setUserName(String userName) {

              this.userName = userName;

       }

}

至此Hibernate里数据库表的继承关系就完全展示出来了。Hibernate里使用映射文件(HBM XML文件)和POJO类来完全封装数据库,使数据库完全对象化,而我们在写程序操作数据库时也完全像操作一个对象一样,这样数据库表的继承关系也表现的非常自然了。