jpa 参数绑定布尔类型_使用Hibernate JPA的自定义布尔用户类型

jpa 参数绑定布尔类型

ANSI SQL 1999标准引入了BOOLEAN数据类型(尽管遗憾的是仅作为可选功能)。 但是到目前为止,大多数主要的数据库系统仍未实现它。 结果,布尔列以各种方式实现。 例如,包含“ Y”或“ N”的CHAR列,或使用BIT列。 随后,JPA无法提供将实体的布尔字段映射到数据库列的标准化方法。

Hibernate为使用包含“ Y”或“ N”字符的CHAR(1)列的布尔实现提供了一个自定义YesNoType。 但是对于其他实践,您基本上必须提供自己的解决方案。 幸运的是,Hibernate提供了创建自己的自定义UserType的可能性。 在此博客条目中,我将提供一个这样的自定义布尔UserType的示例。

最近,我遇到了一个荷兰传统数据库架构,其中“ Y”(表示“是”)和“ N”(表示“否”)分别由“ J”(“ ja”)和“ N”(“ nee”)表示, 分别。 这排除了使用Hibernate的YesNoType。 更复杂的是,其中有些列使用CHAR(1),另一些使用带有填充空间的CHAR(2)–不要问为什么!

因此,我最终编写了一个自定义UserType,使我基本上可以转换以下内容…

起点

@Entity
@Table(name = "FOO_BAR")
public class FooBar implements Serializable {@Column(name = "FOO_ INDICATOR")private String fooIndicator;@Column(name = "BAR_ INDICATOR", length = 2)private String barIndicator;// …
}

进入...

理想情况

@Entity
@Table(name = "FOO_BAR")
@TypeDefs({@TypeDef(name = JaNeeType.NAME, typeClass = JaNeeType.class)
})
public class FooBar implements Serializable {@Column(name = "FOO_INDICATOR)@Type(type = JaNeeType.NAME)private Boolean fooIndicator;@Column(name = "BAR_INDICATOR", length = 2)@Type(type = JaNeeType.NAME, parameters = { @Parameter(name = "length", value = "2") })@Type(type = JaNeeType.NAME)private Boolean barIndicator;// …
}

编码自定义类型被证明是相当简单的。 我只需要实现org.hibernate.usertype.UserType接口。 要处理不同的列长度,需要添加“ length”参数,这需要实现第二个接口org.hibernate.usertype.ParameterizedType。

下面给出的是我所做的最终结果。

JaNeeType

package it.jdev.examples.persistence.hibernate;import java.io.Serializable;
import java.lang.invoke.MethodHandles;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Properties;import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** A type that maps between {@link java.sql.Types#VARCHAR CHAR(1) or CHAR(2)} and {@link Boolean} (using "J " and "N ").* <p>* Optionally, a parameter "length" can be set that will result in right-padding with spaces up to the* specified length.*/
public class JaNeeType implements UserType, ParameterizedType {public static final String NAME = "ja_nee";private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());private int length = 1;@Overridepublic int[] sqlTypes() {return new int[] { Types.VARCHAR };}@SuppressWarnings("rawtypes")@Overridepublic Class returnedClass() {return Boolean.class;}@Overridepublic boolean equals(final Object x, final Object y) throws HibernateException {if (x == null || y == null) {return false;} else {return x.equals(y);}}@Overridepublic int hashCode(final Object x) throws HibernateException {assert (x != null);return x.hashCode();}@Overridepublic Object nullSafeGet(final ResultSet rs, final String[] names, final SessionImplementor session, final Object owner) throws HibernateException, SQLException {final String s = rs.getString(names[0]);if (StringUtils.isBlank(s)) {return false;}if ("J".equalsIgnoreCase(s.trim())) {return Boolean.TRUE;}return Boolean.FALSE;}@Overridepublic void nullSafeSet(final PreparedStatement st, final Object value, final int index, final SessionImplementor session) throws HibernateException, SQLException {String s = Boolean.TRUE.equals(value) ? "J" : "N";if (this.length > 1) {s = StringUtils.rightPad(s, this.length);}st.setString(index, s);}@Overridepublic Object deepCopy(final Object value) throws HibernateException {return value;}@Overridepublic boolean isMutable() {return true;}@Overridepublic Serializable disassemble(final Object value) throws HibernateException {return (Serializable) value;}@Overridepublic Object assemble(final Serializable cached, final Object owner) throws HibernateException {return cached;}@Overridepublic Object replace(final Object original, final Object target, final Object owner) throws HibernateException {return original;}@Overridepublic void setParameterValues(final Properties parameters) {if (parameters != null && !parameters.isEmpty()) {final String lengthString = parameters.getProperty("length");try {if (StringUtils.isNotBlank(lengthString)) {this.length = Integer.parseInt(lengthString);}} catch (final NumberFormatException e) {LOGGER.error("Error parsing int " + lengthString, e);}}}}

翻译自: https://www.javacodegeeks.com/2015/06/custom-boolean-user-type-with-hibernate-jpa.html

jpa 参数绑定布尔类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言实现面向对象编程 : 封装、继承、多态

点击蓝字关注我们不知道有多少人去了解过语言的发展史&#xff0c;早期C语言的语法功能其实比较简单。随着应用需求和场景的变化&#xff0c;C语言的语法功能在不断升级变化。虽然我们的教材有这么一个结论&#xff1a;C语言是面向过程的语言&#xff0c;C是面向对象的编程语言…

GCC-__attribute__()(一)属性机制

简介 __attribute__((option))是编译器对C语言的扩展&#xff0c;可以设置特定的函数、变量和类型的相关属性。 使用场景 主要用于优化代码&#xff0c;保证编码正确&#xff0c;优化程序逻辑&#xff0c;优化存储格式等&#xff0c;正常简单的项目都没必要使用。 属性列表&a…

python利用什么模块_什么是Python的heapq模块?

我尝试了“heapq”并得出结论,我的期望与我在屏幕上看到的不同.我需要有人解释它是如何工作的以及它在哪里有用. If you need to maintain a sorted list as you add and remove values, check out heapq. By using the functions in heapq to add or remove items from a list…

tomcat默认连接数_Tomcat的默认连接器

tomcat默认连接数Tomcat有几个连接器可供选择。 我将把APR连接器放在一边&#xff0c;而将重点放在BIO和NIO上。 BIO连接器&#xff08;阻塞I / O&#xff09;正在阻塞–它使用线程池&#xff0c;每个线程在该线程池中接收请求&#xff0c;处理请求&#xff0c;响应并返回到该…

图解python pdf_Python合并同一个文件夹下所有PDF文件的方法

一、需求说明 下载了网易云课堂的吴恩达免费的深度学习的pdf文档&#xff0c;但是每一节是一个pdf&#xff0c;我把这些PDF文档放在一个文件夹下&#xff0c;希望合并成一个PDF文件。于是写了一个python程序&#xff0c;很好的解决了这个问题。 二、数据形式三、合并效果四、py…

GCC-编译源文件

一、编译流程 一个C程序从源代码到可执行程序一共有四个过程&#xff1a;预处理->编译->汇编->链接 次序执行流程功能GCC命令1预处理展开头文件、宏替换、去掉注释、条件编译gcc - E main.c - o main.i2编译检查语法&#xff0c;生成汇编程序gcc - S main.i - o mai…

用C语言实现状态机设计模式

点击蓝字关注我们状态机模式是一种行为模式&#xff0c;在 《设计模式》 这本书中对其有详细的描述&#xff0c;通过多态实现不同状态的调转行为的确是一种很好的方法&#xff0c;只可惜在嵌入式环境下&#xff0c;有时只能写纯C代码&#xff0c;并且还需要考虑代码的重入和多任…

python的类是什么意思_Python 各种下划线都是啥意思_、_xx、xx_、__xx、__xx__、_classname_...

我们在定义一些变量或者方法的时候&#xff0c;常常会用到下划线&#xff0c;在 Python 中&#xff0c;下划线可是很有用处的哟&#xff0c;比如变量&#xff0c;有些是一个下划线开头的&#xff08;_xx&#xff09;&#xff0c;有些是两个下划线开头的&#xff08;__xx&#x…

c语言学习加强营(一):switch分支

#include <stdio.h> #include <stdlib.h>int main(int argc, char **argv) {int num 0;if (argc 2) {num atoi(argv[1]);}switch (num) {case 0 ... 59:printf("差\n");break;case 60 ... 74:printf("中\n");break;case 75 ... 84:printf(&…

jooq 入门_jOOQ,H2和Maven入门

jooq 入门本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特定语言如何可…

这几行代码,惊为天人!

点击蓝字关注我们事情是这么一回事&#xff1a;国外有个大佬在StackExchange上发起了一个叫做 Tweetable Mathematical Art 的比赛。参赛者需要用C编写代表三原色的RD、GR、BL三个函数&#xff0c;每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数&#x…

线程并发库和线程池的作用_线程和并发介绍

线程并发库和线程池的作用本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01;…

快速搞定C/C++ 的条件编译

点击蓝字关注我们1、条件编译的时机我们都知道vscode其实是一个编辑器&#xff0c;你要在上面跑C或者C你需要配置编译器&#xff0c;拿编译器是怎样吧一个文本文件变成一个可执行文件的呢&#xff1f;那必然是经历以下这四步预处理&#xff1a;宏替换&#xff0c;头文件的展开&…

C语言加强学习营(二):定义整型的最大值和最小值

示例 #include <stdio.h> #include <stdint.h>int main(int argc, char **argv) {uint8_t uint8_max ~(uint8_t)0; /*!< 定义无符号字符型型的最大值 */int8_t int8_max (int8_t)((uint8_t)(~1) >> 1); /*!< 定义有符号字符型的最大值 */uint32_t u…

python连接不上数据库_pycharm连接mysql数据库连接不上

代码其实很简单&#xff0c;只有一小段&#xff0c;是在pycharm上运行的&#xff0c;所用的python版本为2.7&#xff0c;mysql版本为5.7.21 # -*- coding: UTF-8 -*- import re import MySQLdb if __name__ __main__: #打开数据库 conn MySQLdb.connect(hostlocalhost,port33…

assertj_AssertJ的SoftAssertions –我们需要它们吗?

assertj编写好的单元测试的规则之一是&#xff0c;它应该由于一种原因而失败&#xff0c;因此&#xff0c;单元测试应该测试一种逻辑概念。 有时很难在每个测试中拥有一个断言。 为了遵循规则&#xff0c;我们可能在单个测试中每个对象具有多个断言。 但是&#xff0c;在一个测…

用C/C++语言代码实现一个虚拟机

点击蓝字关注我们本文将教你编写一个自己的虚拟机&#xff08;VM&#xff09;&#xff0c;这个虚拟机能够运行汇编语言编写的程序&#xff0c; 例如我朋友编写的 2048 或者我自己的 Roguelike。如果你会编程&#xff0c;但希望 更深入地了解计算机的内部原理以及编程语言是如何…

python对列表中的数值进行统计运算_python-从单词列表中计算元音并返回数字作......

您正在提供一个列表,但是您的逻辑仅适用于单个字符串&#xff1a; number_of_vowels(Bean) # [2] 您需要调整函数的输入,或者修改函数以计算列表中每个元素的元音数量.由于您希望输出为数字列表,因此我假设您正在寻找第二个选项. 为此,只需在列表理解中添加一个额外的for子句&a…

杜克大学_记录链接:与杜克一起玩

杜克大学最近&#xff0c;我在记录链接方面变得非常有趣&#xff0c;并遇到了Duke项目&#xff0c;该项目提供了一些工具来帮助解决此问题。 我以为我会尝试一下。 进行记录链接时的典型问题是&#xff0c;我们有两个来自不同数据集的记录&#xff0c;它们代表同一实体&#x…

嵩天python笔记_嵩天Python学习笔记-05

文件和数据格式化 文本文件和二进制文件 # 文本形式打开文件 tf open("f.txt", "rt") printf(tf.readline()) tf.close() 文件的打开和关闭 文件处理的步骤&#xff1a;打开->操作->关闭 a.open( <文件名>, <打开模式> ) # 打开文件 # …