【hibernate】自定义转换器
【hibernate】自定义转换器
转载:https://www.cnblogs.com/yangchongxing/p/10398255.html
1、转换基本属性
package cn.ycx.study.hibernate.bean; import java.math.BigDecimal;
import java.util.Currency; public class Money {
public static final String SPLIT_SYMBOL = " ";
protected BigDecimal value;
protected Currency currency;
public Money(BigDecimal value, Currency currency) {
this.value = value;
this.currency = currency;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
@Override
public String toString() {
return getValue().toString() + SPLIT_SYMBOL + getCurrency();
}
public static Money fromString(String s) {
String[] split = s.split(SPLIT_SYMBOL);
return new Money(new BigDecimal(split[0]), Currency.getInstance(split[1]));
}
}
转换器实现
package cn.ycx.study.hibernate.converter;
import javax.persistence.AttributeConverter;
import cn.ycx.study.hibernate.bean.Money;
public class MoneyConverter implements AttributeConverter<Money, String> {
@Override
public String convertToDatabaseColumn(Money attribute) {
return attribute.toString();
}
@Override
public Money convertToEntityAttribute(String dbData) {
return Money.fromString(dbData);
}
}
实体对象
package cn.ycx.study.hibernate.entity; import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; import cn.ycx.study.hibernate.bean.Money;
import cn.ycx.study.hibernate.converter.MoneyConverter;
@Entity
@org.hibernate.annotations.DynamicInsert
@org.hibernate.annotations.DynamicUpdate
public class User {
@Id
@GeneratedValue(generator="id_generator")
protected long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Convert(converter = MoneyConverter.class,disableConversion=false)
protected Money money;
public Money getMoney() {
return money;
}
public void setMoney(Money money) {
this.money = money;
}
}
测试
@Test
public void testInsert() {
User u = new User();
u.setMoney(new Money(new BigDecimal(10), Currency.getInstance(Locale.CHINA)));
this.session.persist(u);
assertTrue( true );
}
2、转换组件的属性
package cn.ycx.study.hibernate.entity; import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; import cn.ycx.study.hibernate.bean.Money;
import cn.ycx.study.hibernate.converter.MoneyConverter;
import cn.ycx.study.hibernate.converter.ZipcodeConverter;
@Entity
@org.hibernate.annotations.DynamicInsert
@org.hibernate.annotations.DynamicUpdate
public class User {
@Id
@GeneratedValue(generator="id_generator")
protected long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
//转换基本属性
@Convert( converter = MoneyConverter.class, disableConversion = false )
protected Money money;
public Money getMoney() {
return money;
}
public void setMoney(Money money) {
this.money = money;
}
//转换组件属性
@Convert( converter = ZipcodeConverter.class, attributeName = "zipcode")
protected Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
attributeName 声明了可嵌入 Address 类的 zipcode 属性。这一设置支持圆点属性路径,如果 zipcode 是 可嵌入 City 的属性,则要使用嵌套路径 city.zipcode 类引用它
组件
package cn.ycx.study.hibernate.entity;
import javax.persistence.Embeddable;
import javax.validation.constraints.NotNull; import cn.ycx.study.hibernate.bean.Zipcode;
@Embeddable
public class Address {
@NotNull
protected String street;
@NotNull
protected Zipcode zipcode;
@NotNull
protected City city;
public Address() {
}
public Address(String street, Zipcode zipcode, City city) {
this.street = street;
this.zipcode = zipcode;
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public Zipcode getZipcode() {
return zipcode;
}
public void setZipcode(Zipcode zipcode) {
this.zipcode = zipcode;
}
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
}
package cn.ycx.study.hibernate.bean;
public abstract class Zipcode {
protected String symbol;
protected String value;
public Zipcode(String symbol, String value) {
this.symbol = symbol;
this.value = value;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package cn.ycx.study.hibernate.bean;
public class ChinaZipcode extends Zipcode {
public ChinaZipcode(String symbol, String value) {
super(symbol, value);
}
}
package cn.ycx.study.hibernate.bean;
public class UsaZipcode extends Zipcode {
public UsaZipcode(String symbol, String value) {
super(symbol, value);
}
}
转换器
package cn.ycx.study.hibernate.converter; import javax.persistence.AttributeConverter; import cn.ycx.study.hibernate.bean.ChinaZipcode;
import cn.ycx.study.hibernate.bean.UsaZipcode;
import cn.ycx.study.hibernate.bean.Zipcode; public class ZipcodeConverter implements AttributeConverter<Zipcode, String> { @Override
public String convertToDatabaseColumn(Zipcode attribute) {
return attribute.getValue();
} @Override
public Zipcode convertToEntityAttribute(String dbData) {
if (dbData.length() == 6) {
return new ChinaZipcode("CN", dbData);
} else if (dbData.length() == 5) {
return new UsaZipcode("US", dbData);
}
throw new IllegalArgumentException("Unsupported zipcode in database...");
} }
【hibernate】自定义转换器的更多相关文章
- spring mvc 自定义转换器
<!-- 注册转化器 --> <mvc:annotation-driven conversion-service="conversionService" /> ...
- Hibernate自定义主键
Hibernate自定义主键,通过此方法可以解决一此特殊的主键ID,在了解自定义主键时,先了解下Hibernate有自带的10种生成主键方法. 1) assigned主键由外部程序负责生成,无需Hib ...
- Struts2 请求数据的自动封装 及 自定义转换器类
请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...
- Flask自定义转换器,实现路由匹配正则表达式参数
Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...
- struts2自定义转换器
Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...
- Spring -- 自定义转换器
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中: Converter<S,T> ...
- flask自定义转换器
根据具体的需求,有些时候是需要用到正则来灵活匹配URL,但是Flask的路由匹配机制是不能直接在路由里直接写正则的,这时候就需要使用转换器! Flask的默认转换器: DEFAULT_CONVERTE ...
- Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器
时间关系,本文就 Retrofit 2.0的简单使用 做讲解 至于原理以后有空再去分析 项目全面.简单.易懂 地址: 关于Retrofit 2.0的简单使用如下: https://gitee.c ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
随机推荐
- Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...
- WebSocket网络通信协议
WebSocket 协议在2008年诞生,2011年成为国际标准.所有浏览器都已经支持了. HTTP 协议有一个缺陷:通信只能由客户端发起.这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端 ...
- drf组件之jwt认证
drf组件之jwt认证模块 一.认证规则 全称:json web token 解释:加密字符串的原始数据是json,后台产生,通过web传输给前台存储 格式:三段式 - 头.载荷.签名 - 头和载荷才 ...
- Rust 入门 (一)
Rust 语言的介绍.特性什么的都不说了,如有需要,请自行了解.这里我们直接进去正题. 一.开发环境 mac或linux系统,在命令行安装 curl https://sh.rustup.rs -sSf ...
- SCAU-1078 破密-数学的应用
另外一种方法和该题的题目在这位大佬的博客里 SCAU 1078 破密 还可以参考 https://blog.csdn.net/sinat_34200786/article/details/78 ...
- 【集训Day1 测试】【USACO】照相
照相(fairphoto) [题目描述] 有N 头奶牛站在一条数轴上,第 i 头奶牛的位置是 Pi,奶牛不会重叠站在同一个位置, 第i 头奶牛的颜色是 Ci,其中 Ci 要么是字符'G'要么是字符'H ...
- vi指令详解
★ vi的模式(命令模式.插入模式.ex模式) 1)命令模式: 在我们刚刚通过vi新建或打开一个已经存在的文件时,首先默认被读取的模式就是“命令模式”,命令模式的特征就是,在编辑器窗口左下角的位置上没 ...
- 程序员的算法课(17)-常用的图算法:深度优先(DFS)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...
- docker概念
一.docket概述 什么是docker? 为什么docker会出现 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不 ...
- CCNA 之 四 管理和配置CISCO设备
管理和配置CISCO设备 路由器组件 cpu 执行操作系统的指令 随机访问存储器RAM - RAM中内容断电丢失 - 运行操作系统: - 运行配置文件: - IP 路由表: - ARP 缓存; - 数 ...