用Hibernate时,往往需要添加一对多或多对一映射。比如下面这个持久化类。
package cn.sjsedu.ipbind.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name="computer") public class Computer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String username; private String name; private String ip; private String ipv6; private String mac; private String hdserial; @ManyToOne @JoinColumn(name="school_id") private School school; //setter and getter method }
再看这个表单页面
<form:form commandName="computer" action="save" method="post"> <form:errors path="*" element="div"></form:errors> 使用者:<form:input path="username"/><br/> 计算机名:<form:input path="name"/><br/> IP地址:<form:input path="ip" /><br/> MAC地址:<form:input path="mac" /><br/> 硬盘序列号:<form:input path="hdserial" /><br/> 学校:<form:input path="school" /> <input type="submit" value="提交"/> </form:form>
Spring提供了一些简单的基本转化,比如String转Integer,但是怎么吧String转为School类型呢。这就需要自定义类型转化了。
如何定义自己的类型转换?
Spring提供了三种SPI。(问题:什么是SPI?与API有什么区别?)
分别是:
1. Converter
package org.springframework.core.convert.converter; public interface Converter<S, T> { T convert(S source); }
2. ConverterFactory
package org.springframework.core.convert.converter; public interface ConverterFactory<S, R> { <T extends R> Converter<S, T> getConverter(Class<T> targetType); }
3. GenericConverter
package org.springframework.core.convert.converter; public interface GenericConverter { public Set<ConvertiblePair> getConvertibleTypes(); Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); }
只要实现这些接口就行了。
那么写好了自己的转化类,该如何使用?
只需要在WebApplicationContext中加入如下代码:
<!--下面这行一定要有--> <mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <!--替换自己的类名--> <bean class="example.MyCustomConverter"/> </list> </property> </bean>
这样就Okey了。
参考文献 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/validation.html#core-convert