布尔字段 Oracle vs MySQL



我正在使用休眠来创建表。在我的实体中,我有以下字段。当我使用 MySQL 数据库时,已成功创建此实体。但是在甲骨文 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;
}

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

如果您仔细查看生成的 SQL 语法,您会发现字段的数据类型已锁定,其名称已"锁定"

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

与例如字段 userId 与数据类型 bigint 进行比较时被扭转

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

由于某些数据库尚未实现布尔字段,因此您需要编写一些注释来帮助休眠以执行转换。

如果要将布尔值存储为 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/

DATATYPE

Oracle中是不同的。

另外,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

最新更新