布尔字段 Oracle vs MySQL

Posted

技术标签:

【中文标题】布尔字段 Oracle vs MySQL【英文标题】:Boolean field Oracle vs MySQL 【发布时间】:2015-01-24 10:23:28 【问题描述】:

我正在使用休眠来创建表。在我的实体中,我有以下字段。当我使用 mysql 数据库时,此实体已成功创建。但是在 oracle 10g 上它会抛出错误

create table MetaData (ID bigint not null auto_increment, metaDataId varchar(255) not null, parentId bigint not null, locked bit, userId bigint not null, primary key (ID), unique (metaDataId))

java.sql.SQLSyntaxErrorException: ORA-00907: missing right parenthesis

实体:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorOptions(force = true)
@Table(name = "MetaData", uniqueConstraints = @UniqueConstraint(columnNames = "metaDataId"))
public class MetaData extends SavableEntity 

    @Column(nullable = false)
    private String metaDataId;

    @Column(nullable = false)
    private Long parentId;

    @Column(nullable = false)
    private Long userId;

    @Column
    @Type(type = "boolean")
    private boolean locked;

知道可能出了什么问题吗?

【问题讨论】:

LOCKED 是 oracle 中的关键字。可以尝试其他字段名称吗? 【参考方案1】:

DATATYPEOracle 不同。

另外,auto_increment 不在Oracle 中。在11g 和之前的版本中,创建一个SEQUENCE 来填充ID 列,在12c 中,使用IDENTITY COLUMNS

SQL> DROP TABLE metadata PURGE;

Table dropped.

SQL>
SQL> CREATE TABLE MetaData
  2    (
  3      ID NUMBER NOT NULL,
  4      metaDataId VARCHAR2(255) NOT NULL,
  5      parentId number NOT NULL,
  6      locked number,
  7      userId number NOT NULL,
  8      CONSTRAINT p_id PRIMARY KEY (id),
  9      CONSTRAINT u_metadataid UNIQUE (metaDataId)
 10    );

Table created.

SQL>

对于ID的auto_increment,在Oracle 10g中,需要创建一个sequence

12c 中,您可以拥有IDENTITY COLUMN

【讨论】:

我用的是 11g 所以这不是问题【参考方案2】:

如果您仔细查看生成的 SQL 语法,您会发现该字段的数据类型已锁定,并且它的名称“已锁定”

create table MetaData (..., **locked bit**, ...)

与例如数据类型为 bigint 的字段 userId

create table MetaData (..., **userId bigint not null**, ...)

由于某些数据库没有实现布尔字段,但您需要编写一些注释来帮助 hibernate 执行转换。

如果要将布尔值存储为 T 或 F,请使用:

@Type(type="true_false")
private Boolean active;

要将它们存储为 1 或 0,请使用:

@Type(type="boolean")
private Boolean active;

先生。 Jake Trent 提供了一篇关于如何执行休眠布尔转换的精彩帖子:http://jaketrent.com/post/hibernate-boolean-conversion/

【讨论】:

以上是关于布尔字段 Oracle vs MySQL的主要内容,如果未能解决你的问题,请参考以下文章

mysql创建布尔字段

如何将布尔字段添加到 MySQL?

mysql 数据库中的布尔字段

布尔字段始终为真

C#的EF中的字段类型布尔型,mysql数据库里是bit类型,提交识别不了该字段赋的true和false,为啥呢?

Oracle-实现Boolean类型字段