posts - 167,  comments - 30,  trackbacks - 0
     摘要:   阅读全文
posted @ 2013-11-18 18:01 David1228 阅读(2873) | 评论 (4)编辑 收藏
     摘要:   阅读全文
posted @ 2013-10-31 17:32 David1228 阅读(681) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2013-10-14 09:50 David1228 阅读(21694) | 评论 (6)编辑 收藏
Hibernate不支持left join带on的条件查询。
解决办法:使用原生SQL或者使用HQL方式需要修改hbm文件(如果项目中大部分不适用级联配置情况下)
需求是查询网络信息,网络信息中关联了分区、网络IP(1个网络--N个网络IP),网桥信息.
HQL:
public void queryVnets(Page page) {
        StringBuffer hql = new StringBuffer();
        hql.append("select new Map(vn.id as id, vn.vnName as vnName, b.name as vnType, ");
        hql.append("vn.vnIptype as vnIptype, vn.vnIp as vnIp,vn.vnNat as vnNat, vn.vnFlag as vnFlag, ");
        hql.append("vn.vnetFlag as vnetFlag, (case when sum(vmvn.state)='0' then 0 else 1 endas vnState, ");
        hql.append("vn.useType as useType, vn.createTime as createTime, ");
        hql .append("zone.oneName as oneName, zone.oneHypervisor as oneHypervisor, zone.oneSeq as oneSeq) ");
        hql.append("from VnetTable vn, ZoneTable zone, BridgeTable b ");
        hql.append("left join fetch vn.VnTables vmvn where zone.id = vn.zoneId and vn.vnType = b.id ");

        ... ...
        hql.append(" group by vn.id");
        if (vnState != null && !"".equals(vnState)) {
            if ("0".equals(vnState)) {
                hql.append(" having sum(vmvn.state)=0");
            } else if ("1".equals(vnState)) {
                hql.append(" having sum(vmvn.state)!=0");
            }
        }
    }

hbm配置文件:
<?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.base.mapping.VnetTable" table="vnet_table" >
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid.hex" />
        </id>
        <property name="vnId" type="java.lang.Long">
            <column name="VN_ID">
                <comment>创建虚拟网络时得到的ID</comment>
            </column>
        </property>
         ...
        <property name="zoneId" type="java.lang.String">
            <column name="ZONE_ID" length="32">
                <comment>分区ID</comment>
            </column>
        </property>
        <property name="vlanId" type="java.lang.Integer">
            <column name="VLAN_ID">
                <comment>VLAN_ID</comment>
            </column>
        </property>
        <set name="vnTables" lazy="false" order-by="id asc" inverse="false" fetch="join" cascade="all">
            <key column="VN_NID"/>
            <one-to-many class="com.base.mapping.VnTable"/>
        </set>
    </class>
</hibernate-mapping>

理解inverse和cascade,可以参考:http://blog.csdn.net/wkcgy/article/details/6271321
总结: 
<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护 
<many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置 
Cascade,通常情况下都不会使用。特别是删除,一定要慎重。
操作建议 
  一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。
  many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表










posted @ 2013-09-12 11:57 David1228 阅读(16631) | 评论 (2)编辑 收藏
-- 以下两个查询效率相当,查询时间均为0.0xx秒,~ 但是Hibernate HQL不支持from后面接子查询,可以直接使用SQL方式解决,ibatis当然可以用了。
SELECT count(*from (
SELECT sum(t2.STATE) as vnSum, t1.ID FROM
vnetinfo_table t1, vm_vn_table t2 
where t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID) t where t.vnSum = 0;

SELECT count(*) FROM vnetinfo_table v ,(
SELECT sum(t2.STATE) as vnSum, t1.ID as idd FROM
vnetinfo_table t1, vm_vn_table t2 
where t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID) t
where v.ID = t.idd and t.vnSum = 0;

-- 查询效率太低了,查询时间均为0.5xx秒左右。要比以上两个SQL耗时很多倍。~ Hibernate支持在where后用子查询作为查询条件。
SELECT count(*) FROM vnetinfo_table v WHERE v.id in 
(SELECT CASE WHEN SUM(t2.STATE)=0 THEN t1.ID ELSE '' END
FROM vnetinfo_table t1, vm_vn_table t2 
where t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID);

-- 使用join方式替换in 查询时间均为0.09x秒左右。明显提高了效率,但是Hibernate HQL任然不支持在这种联合子查询方式。
SELECT count(*) FROM vnetinfo_table v INNER JOIN (SELECT CASE WHEN SUM(t2.STATE)=0 THEN t1.ID ELSE '' END as idd
FROM vnetinfo_table t1, vm_vn_table t2 
WHERE t1.ID = t2.VN_NID and t1.ZONE_ID = '4028a49c3facdf26013fae12531b286e' GROUP BY t1.ID) t ON v.ID = t.idd and t.idd IS not NULL;

附:Mysql中关于Exists用法的介绍请参见:http://www.nowamagic.net/librarys/veda/detail/639
posted @ 2013-08-21 13:47 David1228 阅读(3745) | 评论 (2)编辑 收藏
md5sum命令详解:
linux下的shell命令 ,制作md5码 也用于软件的md5校验
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。
在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。
1、使用md5sum来产生指纹(报文摘要)命令如下:
md5sum filename > filename.md5 或者
md5sum filename >>filename.md5
也可以把多个文件的报文摘要输出到一个md5文件中,这要使用通配符*,比如某目录下有几个iso文件,要把这几个iso文件的摘要输出到iso.md5文件中,命令如下:
md5sum *.iso > iso.md5
2、使用md5报文摘要验证文件,方法有二:
把下载的文件file和该文件的file.md5报文摘要文件放在同一个目录下,然后用如下命令进行验证:
md5sum -c file.md5
然后如果验证成功,则会输出:正确结果。
实战案例:
需求:虚拟机存在多份备份,当进行备份恢复时,要求检查源备份压缩文件的完整性。那么可以通过md5这种方式来验证。
压缩备份文件并生成md5码,部分shell脚本如下:
#----------------------------------
log "Compressing and moving $SRC_PATH"
exec_and_log "$SSH $SRC_HOST mkdir -p ${SRC_PATH}_compress"
for file in `$SSH $SRC_HOST ls $SRC_PATH | grep -v $SN_SIGN`
do
     exec_and_log "$SSH $SRC_HOST cd $SRC_PATH;sudo chmod -R +r $SRC_PATH/*;tar -Sczvf ${SRC_PATH}_compress/${file}.tgz ${file}"
done
#----------------------------------

#--------------md5 begin-----------------
log "Create backup.md5"
exec_and_log "$SSH $SRC_HOST $MD5SUM ${SRC_PATH}_compress/*.tgz > ${SRC_PATH}_compress/backup.md5"
#--------------md5 end-----------------

#其中 exec_and_log是另一个公共脚本中定义的。shell中可以通过点(.)的方式将脚本引入。该函数内如下:
# Executes a command, if it fails returns error message and exits
# If a second parameter is present it is used as the error message when
# the command fails
function exec_and_log
{
    message=$2

    EXEC_LOG_ERR=`$1 2>&1 1>/dev/null`
    EXEC_LOG_RC=$?

    if [ $EXEC_LOG_RC -ne 0 ]; then
        log_error "Command \"$1\" failed: $EXEC_LOG_ERR"

        if [ -n "$2" ]; then
            error_message "$2"
        else
            error_message "Error executing $1: $EXEC_LOG_ERR"
        fi
        exit $EXEC_LOG_RC
    fi
}

# Logs a message, alias to log_info
function log
{
    log_info "$1"
}

# Log function that knows how to deal with severities and adds the
# script name
function log_function
{
    echo "$1: $SCRIPT_NAME: $2" 1>&2
}

# Logs an info message
function log_info
{
    log_function "INFO" "$1"
}

# Logs an error message
function log_error
{
    log_function "ERROR" "$1"
}

# This function is used to pass error message to the mad
function error_message
{
    (
        echo "ERROR MESSAGE --8<------"
        echo "$1"
        echo "ERROR MESSAGE ------>8--"
    ) 1>&2
}

生成的backup.md5内容:
$ md5sum *.tgz > backup.md5 
2c07174d451a687bc0e401b1dc7d84b8  checkpoint.1376892493.tgz
57a18d7f6eed36565b9012e519985130  checkpoint.1376903188.tgz
b652990806e58a81b41dc1b23db9adda  checkpoint.1376904023.tgz
f4e7adb46a8fde2643e082875cc60e21  checkpoint.1376904289.tgz
ad2a59902652e2896b35507417b7016f  checkpoint.tgz
4bd43eac64f238bb35c7194816da7d23  deployment.0.tgz
ee3d9266cf92f7540cc75a94343bc20a  deployment.7.tgz
fcd5aae37354b5cb66f4b90544eaa5c3  disk.0.tgz
c1ef6d911b441660ec2d1e44b5a56f66  disk.1.iso.tgz
25eae70a31a7c7cff3baade4cd65fe82  disk.1.tgz

检查备份文件是否完整:
exec_and_log "$SSH $SRC_HOST $MD5SUM -c ${SRC_PATH}/backup.md5"

检测结果:
$ md5sum -c backup.md5 
checkpoint.1376892493.tgz: OK
checkpoint.1376903188.tgz: OK
checkpoint.1376904023.tgz: OK
checkpoint.1376904289.tgz: OK
checkpoint.tgz: OK
deployment.0.tgz: OK
deployment.7.tgz: OK
disk.0.tgz: OK
disk.1.iso.tgz: OK
disk.1.tgz: OK
posted @ 2013-08-20 11:34 David1228 阅读(2416) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2013-08-20 09:46 David1228 阅读(371) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2013-08-20 09:44 David1228 阅读(368) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2013-07-24 16:11 David1228 阅读(33374) | 评论 (0)编辑 收藏
     摘要: 根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求。下面就将通过Mybatis-Spring来整合Mybatis跟Spring的用法做一个简单的介绍。MapperFactoryB...  阅读全文
posted @ 2013-07-10 18:07 David1228 阅读(21381) | 评论 (2)编辑 收藏
仅列出标题
共16页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last 

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

新闻分类

新闻档案

相册

收藏夹

Java

Linux知识相关

Spring相关

云计算/Linux/虚拟化技术/

友情博客

多线程并发编程

开源技术

持久层技术相关

搜索

  •  

积分与排名

  • 积分 - 354226
  • 排名 - 155

最新评论

阅读排行榜

评论排行榜