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语句.