hibernate 生成表时,boolean 字段怎么办?要求跨数据库!

小灰狼 2020-03-11 11:59:31
之前一直在达梦数据库(国产数据库,商务原因必须要支持国产数据库)还有mysql 上开发,其中实体类用到了Boolean类型
现在要求支持 oracle 数据库,发现利用hibernate生成oracle表时,Boolean 类型就不行了,按网上说的,在 Boolean 类型的属性上加上 @org.hibernate.annotations.Type (type = "byte"),在oracle上运行成功,但又不支持之前的达梦数据库了(mysql 没试,但估计也不行),无法把一个 Byte 类型的值赋值给Boolean类型变量
...全文
535 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2020-03-11
  • 打赏
  • 举报
回复
引用 2 楼 bcsflilong 的回复:
@org.hibernate.annotations.Type(type="yes_no") 你们这里 想存YN 还是01
存NY可以,存01也可以,但必须达满足以下几个要求: 1、支持跨数据库,当客户要求使用别的数据库时,只要修改一下配置就可以,原代码里的代码不允许改动 2、支持使用 hibernate 生成数据表,对一个新安装的数据库,利用 hibernate生成 ddl 创建数据表 3、不允许提出对应用层程序的修改 现在问题就卡在数据库对字段类型的支持方面 1、由于 oracle 不支持 bit 类型数据,要使用org.hibernate.annotations.Type 注解,类型使用 yes_no 或者 byte,否则在 oracle 数据库下,无法创建表,它会把建表语句变成: create table table_name( ...... boolean_column boolean, ...... ); oracle 会报“不支持的数据类型”错误 2、如果把这些 Boolean 类型的字段在实体类中定义成 Byte,就必须重写它们的 getter/setter 方法,就象这样: public class Employee { ...... private Byte married; // 是否已婚 ...... public Boolean isMarried(){ if(married == null) return null; return married.byteValue != 0; } public void setMarried(Boolean value){ if(value == null) married = null; else married = value.booleanValue() ? 1 : 0; } } 这样改,虽然可以解决数据库问题,但是这些类被序列化为 json 格式时,属性值都成了整数,不是原来的 true/false,如此一来,客户端的 js 要进行大改。
小灰狼 2020-03-11
  • 打赏
  • 举报
回复
引用 1 楼 bcsflilong 的回复:
你应该咨询一下达梦那边 应该是他们的方言包有问题
现在问题不是达梦有问题,而是 Oracle 有问题! 达梦、mysql、sql server 都有 bit 类型,但 oracle 里却没有,因此导致了映射的时候,必须指定数据库字段为字符或者数字!
bcsflilong 2020-03-11
  • 打赏
  • 举报
回复
@org.hibernate.annotations.Type(type="yes_no") 你们这里 想存YN 还是01
bcsflilong 2020-03-11
  • 打赏
  • 举报
回复
你应该咨询一下达梦那边 应该是他们的方言包有问题

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧