◎筱米加步枪◎.Blog

Happy coding

Sping中自定义默认注解名生成器

在类中贴上@Repository等标签,相当于在Spring容器里定义了一个Bean类,这个Bean的名称如果不指定名称,将默认使用当前类名(不含包名)的首字母小写作为Bean的名字.

需求:

要确保这个Bean名称要唯一,显然这样定义的Bean名称太过简单,比较容易造成一样情况,如果能使用全类名作为Bean可防止这样的情况,因为不存在全类名一样的类.例如:org.kirinsoft.frame.AClass

技术实现:

指定定义一个Bean名字生成器,实现Spring提供的BeanNameGenerator,在generateBeanName方法中设计出自己需要的Bean名称.

另外在Spring配置文件中的自动注解配置要指定名字生成器类,如:

	<!-- 自动注解配置 -->
	<context:annotation-config />
	<context:component-scan base-package="com.kirinsoft.frame"
		name-generator="com.kirinsoft.frame.pub.UniqueBeanNameGenerator" />

具体实现方法:

/**
 * 唯一Bean名称生成器.以类全名作为Bean名称.
 */
public class UniqueBeanNameGenerator implements BeanNameGenerator{

	@Override
	public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
		return definition.getBeanClassName();
	}
}

 

Spring中事务的作用范围

下面一种情景:

在做项目中通常会进行分层架构.假设可分为Service、Biz、Dao3层.关系如下:

一个Service类调用多个Biz类,一个Biz调用多个Dao类完成业务逻辑.

基于这种情况,通常我们把事务控制到Service层.

很当然的引入Spring中配置:(其他配置略)

<property name="beanNames">
            <list>
                <value>*ServiceImpl</value>
            </list>
        </property>

 

那么,引入一个问题:如果同时对Service层和Biz层加入Spring的事务配置中,是哪一层起作用呢、?

换句话说,假设一个Service有两个Biz类,那么第一个Biz类操作成功,而第二个操作失败,此时第一个Biz是否有回滚呢。?

对应的Spring配置:

        <property name="beanNames">
            <list>
                <value>*ServiceImpl</value>
                <value>*BizImpl</value>
            </list>
        </property>

通过实验证明可得到结论:哪个包含的范围大,哪个事务起作用。

上面的假设,Service的事务起作用,第一个Biz会被回滚掉。

有关Hibernate中PO对象Blob字段的注解

PO对象中使用Hibernate注解方式进行映射.Blob字段描述如下:

1.首先PO对象中属性名可指定为byte数组(byte[])
   

private byte [] templateData;

2.在Setter方法中进行注解方式如下:

    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "TEMPLATE_DATA",columnDefinition="BLOB")
    public byte [] getTemplateData() {
        return this.templateData;
    }

 

有关Oracle中的Blob字段更新问题

先说下偶遇到的问题:

Oracle中我使用Blob字段来存一个Xml内容.新增一条记录正常,但是尝试用一条记录去更新已经存在的记录.

发现Blob中的字段中的内容并没有被更新掉.


网络上的一些朋友说原因如下:

假设Blob字段中已经存在的内容是100个字节,那么尝试用50字节的内容去更新,

那么得到的结果就是:前面50个字节被覆盖,而Blob仍然存在100个字节,其中后面50个字节是原先的后50个字节.


那么解决的方法如下:(证实可以通过)

先清空原Blob字段中的数据,再进行字节的写入.(与平常的更新操作会多了一步).

具体的更新方法如下:

UPDATE 表名 SET BLOB字段=EMPTY_BLOB() WHERE 条件.

然后再执行具体的更新SQL语句.